// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus
namespace ccc { 
struct  AA0  {
  virtual void  abc(); // _ZN3ccc3AA03abcEv
  virtual void  efg(); // _ZN3ccc3AA03efgEv
  virtual void  pqr(); // _ZN3ccc3AA03pqrEv
  ~AA0(); // tgen
  AA0(); // tgen
};
//SIG(-1 _ZN3ccc3AA0E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA0 ::abc(){vfunc_called(this, "_ZN3ccc3AA03abcEv");}
void  ccc::AA0 ::efg(){vfunc_called(this, "_ZN3ccc3AA03efgEv");}
void  ccc::AA0 ::pqr(){vfunc_called(this, "_ZN3ccc3AA03pqrEv");}
ccc::AA0 ::~AA0(){ note_dtor("_ZN3ccc3AA0E", this);} // tgen
ccc::AA0 ::AA0(){ note_ctor("_ZN3ccc3AA0E", this);} // tgen
}
static void Test__ZN3ccc3AA0E()
{
  extern Class_Descriptor cd__ZN3ccc3AA0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA0E, buf);
    ::ccc::AA0 *dp, &lv = *(dp=new (buf) ::ccc::AA0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA0E)");
    test_class_info(&lv, &cd__ZN3ccc3AA0E);
    dp->::ccc::AA0::~AA0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA0E(Test__ZN3ccc3AA0E, "_ZN3ccc3AA0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA0C1Ev();
extern void _ZN3ccc3AA0D1Ev();
Name_Map name_map__ZN3ccc3AA0E[] = {
  NSPAIR(_ZN3ccc3AA0C1Ev),
  NSPAIR(_ZN3ccc3AA0D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA0E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
Class_Descriptor cd__ZN3ccc3AA0E = {  "_ZN3ccc3AA0E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA0E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA0E),5, //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
namespace ccc { 
struct  BB0  {
  virtual void  abc(); // _ZN3ccc3BB03abcEv
  virtual void  efg(); // _ZN3ccc3BB03efgEv
  virtual void  pqr(); // _ZN3ccc3BB03pqrEv
  ~BB0(); // tgen
  BB0(); // tgen
};
//SIG(1 _ZN3ccc3BB0E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB0 ::abc(){vfunc_called(this, "_ZN3ccc3BB03abcEv");}
void  ccc::BB0 ::efg(){vfunc_called(this, "_ZN3ccc3BB03efgEv");}
void  ccc::BB0 ::pqr(){vfunc_called(this, "_ZN3ccc3BB03pqrEv");}
ccc::BB0 ::~BB0(){ note_dtor("_ZN3ccc3BB0E", this);} // tgen
ccc::BB0 ::BB0(){ note_ctor("_ZN3ccc3BB0E", this);} // tgen
}
static void Test__ZN3ccc3BB0E()
{
  extern Class_Descriptor cd__ZN3ccc3BB0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB0E, buf);
    ::ccc::BB0 *dp, &lv = *(dp=new (buf) ::ccc::BB0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB0E)");
    test_class_info(&lv, &cd__ZN3ccc3BB0E);
    dp->::ccc::BB0::~BB0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB0E(Test__ZN3ccc3BB0E, "_ZN3ccc3BB0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB0C1Ev();
extern void _ZN3ccc3BB0D1Ev();
Name_Map name_map__ZN3ccc3BB0E[] = {
  NSPAIR(_ZN3ccc3BB0C1Ev),
  NSPAIR(_ZN3ccc3BB0D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB0E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
Class_Descriptor cd__ZN3ccc3BB0E = {  "_ZN3ccc3BB0E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB0E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB0E),5, //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
namespace ccc { 
struct  EE0x0  : virtual ::ccc::AA0 {
  virtual void  abc(); // _ZN3ccc5EE0x03abcEv
  virtual void  efg(); // _ZN3ccc5EE0x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE0x03pqrEv
  ~EE0x0(); // tgen
  EE0x0(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x0E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x03abcEv");}
void  ccc::EE0x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x03efgEv");}
void  ccc::EE0x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x03pqrEv");}
ccc::EE0x0 ::~EE0x0(){ note_dtor("_ZN3ccc5EE0x0E", this);} // tgen
ccc::EE0x0 ::EE0x0(){ note_ctor("_ZN3ccc5EE0x0E", this);} // tgen
}
static void Test__ZN3ccc5EE0x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x0E, buf);
    ::ccc::EE0x0 *dp, &lv = *(dp=new (buf) ::ccc::EE0x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x0E);
    dp->::ccc::EE0x0::~EE0x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x0E(Test__ZN3ccc5EE0x0E, "_ZN3ccc5EE0x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x0C1Ev();
extern void _ZN3ccc5EE0x0D1Ev();
Name_Map name_map__ZN3ccc5EE0x0E[] = {
  NSPAIR(_ZN3ccc5EE0x0C1Ev),
  NSPAIR(_ZN3ccc5EE0x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x0E[];
extern void _ZN3ccc5EE0x03abcEv();
extern void _ZN3ccc5EE0x03efgEv();
extern void _ZN3ccc5EE0x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x0E[] = {
  {&(_ZTVN3ccc5EE0x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
Class_Descriptor cd__ZN3ccc5EE0x0E = {  "_ZN3ccc5EE0x0E", // class name
  bases__ZN3ccc5EE0x0E, 1,
  &(vtc__ZN3ccc5EE0x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x0E),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
namespace ccc { 
struct  EE0x1  : virtual ::ccc::AA0 {
  virtual void  abc(); // _ZN3ccc5EE0x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE0x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE0x13efgEv
  ~EE0x1(); // tgen
  EE0x1(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x1E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x13abcEv");}
void  ccc::EE0x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x13pqrEv");}
void  ccc::EE0x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x13efgEv");}
ccc::EE0x1 ::~EE0x1(){ note_dtor("_ZN3ccc5EE0x1E", this);} // tgen
ccc::EE0x1 ::EE0x1(){ note_ctor("_ZN3ccc5EE0x1E", this);} // tgen
}
static void Test__ZN3ccc5EE0x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x1E, buf);
    ::ccc::EE0x1 *dp, &lv = *(dp=new (buf) ::ccc::EE0x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x1E);
    dp->::ccc::EE0x1::~EE0x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x1E(Test__ZN3ccc5EE0x1E, "_ZN3ccc5EE0x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x1C1Ev();
extern void _ZN3ccc5EE0x1D1Ev();
Name_Map name_map__ZN3ccc5EE0x1E[] = {
  NSPAIR(_ZN3ccc5EE0x1C1Ev),
  NSPAIR(_ZN3ccc5EE0x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x1E[];
extern void _ZN3ccc5EE0x13abcEv();
extern void _ZN3ccc5EE0x13efgEv();
extern void _ZN3ccc5EE0x13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x1E[] = {
  {&(_ZTVN3ccc5EE0x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
Class_Descriptor cd__ZN3ccc5EE0x1E = {  "_ZN3ccc5EE0x1E", // class name
  bases__ZN3ccc5EE0x1E, 1,
  &(vtc__ZN3ccc5EE0x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x1E),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
namespace ccc { 
struct  EE0x2  : virtual ::ccc::AA0 {
  virtual void  efg(); // _ZN3ccc5EE0x23efgEv
  virtual void  abc(); // _ZN3ccc5EE0x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE0x23pqrEv
  ~EE0x2(); // tgen
  EE0x2(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x2E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x23efgEv");}
void  ccc::EE0x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x23abcEv");}
void  ccc::EE0x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x23pqrEv");}
ccc::EE0x2 ::~EE0x2(){ note_dtor("_ZN3ccc5EE0x2E", this);} // tgen
ccc::EE0x2 ::EE0x2(){ note_ctor("_ZN3ccc5EE0x2E", this);} // tgen
}
static void Test__ZN3ccc5EE0x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x2E, buf);
    ::ccc::EE0x2 *dp, &lv = *(dp=new (buf) ::ccc::EE0x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x2E);
    dp->::ccc::EE0x2::~EE0x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x2E(Test__ZN3ccc5EE0x2E, "_ZN3ccc5EE0x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x2C1Ev();
extern void _ZN3ccc5EE0x2D1Ev();
Name_Map name_map__ZN3ccc5EE0x2E[] = {
  NSPAIR(_ZN3ccc5EE0x2C1Ev),
  NSPAIR(_ZN3ccc5EE0x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x2E[];
extern void _ZN3ccc5EE0x23abcEv();
extern void _ZN3ccc5EE0x23efgEv();
extern void _ZN3ccc5EE0x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x2E[] = {
  {&(_ZTVN3ccc5EE0x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
Class_Descriptor cd__ZN3ccc5EE0x2E = {  "_ZN3ccc5EE0x2E", // class name
  bases__ZN3ccc5EE0x2E, 1,
  &(vtc__ZN3ccc5EE0x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x2E),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
namespace ccc { 
struct  EE0x3  : virtual ::ccc::AA0 {
  virtual void  efg(); // _ZN3ccc5EE0x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE0x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE0x33abcEv
  ~EE0x3(); // tgen
  EE0x3(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x3E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x33efgEv");}
void  ccc::EE0x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x33pqrEv");}
void  ccc::EE0x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x33abcEv");}
ccc::EE0x3 ::~EE0x3(){ note_dtor("_ZN3ccc5EE0x3E", this);} // tgen
ccc::EE0x3 ::EE0x3(){ note_ctor("_ZN3ccc5EE0x3E", this);} // tgen
}
static void Test__ZN3ccc5EE0x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x3E, buf);
    ::ccc::EE0x3 *dp, &lv = *(dp=new (buf) ::ccc::EE0x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x3E);
    dp->::ccc::EE0x3::~EE0x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x3E(Test__ZN3ccc5EE0x3E, "_ZN3ccc5EE0x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x3C1Ev();
extern void _ZN3ccc5EE0x3D1Ev();
Name_Map name_map__ZN3ccc5EE0x3E[] = {
  NSPAIR(_ZN3ccc5EE0x3C1Ev),
  NSPAIR(_ZN3ccc5EE0x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x3E[];
extern void _ZN3ccc5EE0x33abcEv();
extern void _ZN3ccc5EE0x33efgEv();
extern void _ZN3ccc5EE0x33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x3E[] = {
  {&(_ZTVN3ccc5EE0x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
Class_Descriptor cd__ZN3ccc5EE0x3E = {  "_ZN3ccc5EE0x3E", // class name
  bases__ZN3ccc5EE0x3E, 1,
  &(vtc__ZN3ccc5EE0x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x3E),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
namespace ccc { 
struct  EE0x4  : virtual ::ccc::AA0 {
  virtual void  pqr(); // _ZN3ccc5EE0x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE0x43abcEv
  virtual void  efg(); // _ZN3ccc5EE0x43efgEv
  ~EE0x4(); // tgen
  EE0x4(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x4E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x43pqrEv");}
void  ccc::EE0x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x43abcEv");}
void  ccc::EE0x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x43efgEv");}
ccc::EE0x4 ::~EE0x4(){ note_dtor("_ZN3ccc5EE0x4E", this);} // tgen
ccc::EE0x4 ::EE0x4(){ note_ctor("_ZN3ccc5EE0x4E", this);} // tgen
}
static void Test__ZN3ccc5EE0x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x4E, buf);
    ::ccc::EE0x4 *dp, &lv = *(dp=new (buf) ::ccc::EE0x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x4E);
    dp->::ccc::EE0x4::~EE0x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x4E(Test__ZN3ccc5EE0x4E, "_ZN3ccc5EE0x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x4C1Ev();
extern void _ZN3ccc5EE0x4D1Ev();
Name_Map name_map__ZN3ccc5EE0x4E[] = {
  NSPAIR(_ZN3ccc5EE0x4C1Ev),
  NSPAIR(_ZN3ccc5EE0x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x4E[];
extern void _ZN3ccc5EE0x43abcEv();
extern void _ZN3ccc5EE0x43efgEv();
extern void _ZN3ccc5EE0x43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x4E[] = {
  {&(_ZTVN3ccc5EE0x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
Class_Descriptor cd__ZN3ccc5EE0x4E = {  "_ZN3ccc5EE0x4E", // class name
  bases__ZN3ccc5EE0x4E, 1,
  &(vtc__ZN3ccc5EE0x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x4E),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
namespace ccc { 
struct  EE0x5  : virtual ::ccc::AA0 {
  virtual void  pqr(); // _ZN3ccc5EE0x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE0x53efgEv
  virtual void  abc(); // _ZN3ccc5EE0x53abcEv
  ~EE0x5(); // tgen
  EE0x5(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x5E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE0x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x53pqrEv");}
void  ccc::EE0x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x53efgEv");}
void  ccc::EE0x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x53abcEv");}
ccc::EE0x5 ::~EE0x5(){ note_dtor("_ZN3ccc5EE0x5E", this);} // tgen
ccc::EE0x5 ::EE0x5(){ note_ctor("_ZN3ccc5EE0x5E", this);} // tgen
}
static void Test__ZN3ccc5EE0x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x5E, buf);
    ::ccc::EE0x5 *dp, &lv = *(dp=new (buf) ::ccc::EE0x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x5E);
    dp->::ccc::EE0x5::~EE0x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x5E(Test__ZN3ccc5EE0x5E, "_ZN3ccc5EE0x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x5C1Ev();
extern void _ZN3ccc5EE0x5D1Ev();
Name_Map name_map__ZN3ccc5EE0x5E[] = {
  NSPAIR(_ZN3ccc5EE0x5C1Ev),
  NSPAIR(_ZN3ccc5EE0x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x5E[];
extern void _ZN3ccc5EE0x53abcEv();
extern void _ZN3ccc5EE0x53efgEv();
extern void _ZN3ccc5EE0x53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x5E[] = {
  {&(_ZTVN3ccc5EE0x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
Class_Descriptor cd__ZN3ccc5EE0x5E = {  "_ZN3ccc5EE0x5E", // class name
  bases__ZN3ccc5EE0x5E, 1,
  &(vtc__ZN3ccc5EE0x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x5E),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
namespace ccc { 
struct  EE0x6  : virtual ::ccc::AA0 {
  virtual void  abc(); // _ZN3ccc5EE0x63abcEv
  virtual void  efg(); // _ZN3ccc5EE0x63efgEv
  ~EE0x6(); // tgen
  EE0x6(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x6E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE0x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x63abcEv");}
void  ccc::EE0x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x63efgEv");}
ccc::EE0x6 ::~EE0x6(){ note_dtor("_ZN3ccc5EE0x6E", this);} // tgen
ccc::EE0x6 ::EE0x6(){ note_ctor("_ZN3ccc5EE0x6E", this);} // tgen
}
static void Test__ZN3ccc5EE0x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x6E, buf);
    ::ccc::EE0x6 *dp, &lv = *(dp=new (buf) ::ccc::EE0x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x6E);
    dp->::ccc::EE0x6::~EE0x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x6E(Test__ZN3ccc5EE0x6E, "_ZN3ccc5EE0x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x6C1Ev();
extern void _ZN3ccc5EE0x6D1Ev();
Name_Map name_map__ZN3ccc5EE0x6E[] = {
  NSPAIR(_ZN3ccc5EE0x6C1Ev),
  NSPAIR(_ZN3ccc5EE0x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x6E[];
extern void _ZN3ccc5EE0x63abcEv();
extern void _ZN3ccc5EE0x63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x6E[] = {
  {&(_ZTVN3ccc5EE0x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
Class_Descriptor cd__ZN3ccc5EE0x6E = {  "_ZN3ccc5EE0x6E", // class name
  bases__ZN3ccc5EE0x6E, 1,
  &(vtc__ZN3ccc5EE0x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x6E),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
namespace ccc { 
struct  EE0x7  : virtual ::ccc::AA0 {
  virtual void  abc(); // _ZN3ccc5EE0x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE0x73pqrEv
  ~EE0x7(); // tgen
  EE0x7(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x7E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE0x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x73abcEv");}
void  ccc::EE0x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x73pqrEv");}
ccc::EE0x7 ::~EE0x7(){ note_dtor("_ZN3ccc5EE0x7E", this);} // tgen
ccc::EE0x7 ::EE0x7(){ note_ctor("_ZN3ccc5EE0x7E", this);} // tgen
}
static void Test__ZN3ccc5EE0x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x7E, buf);
    ::ccc::EE0x7 *dp, &lv = *(dp=new (buf) ::ccc::EE0x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x7E);
    dp->::ccc::EE0x7::~EE0x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x7E(Test__ZN3ccc5EE0x7E, "_ZN3ccc5EE0x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x7C1Ev();
extern void _ZN3ccc5EE0x7D1Ev();
Name_Map name_map__ZN3ccc5EE0x7E[] = {
  NSPAIR(_ZN3ccc5EE0x7C1Ev),
  NSPAIR(_ZN3ccc5EE0x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x7E[];
extern void _ZN3ccc5EE0x73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc5EE0x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x7E[] = {
  {&(_ZTVN3ccc5EE0x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
Class_Descriptor cd__ZN3ccc5EE0x7E = {  "_ZN3ccc5EE0x7E", // class name
  bases__ZN3ccc5EE0x7E, 1,
  &(vtc__ZN3ccc5EE0x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x7E),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
namespace ccc { 
struct  EE0x8  : virtual ::ccc::AA0 {
  virtual void  efg(); // _ZN3ccc5EE0x83efgEv
  virtual void  abc(); // _ZN3ccc5EE0x83abcEv
  ~EE0x8(); // tgen
  EE0x8(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x8E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE0x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x83efgEv");}
void  ccc::EE0x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE0x83abcEv");}
ccc::EE0x8 ::~EE0x8(){ note_dtor("_ZN3ccc5EE0x8E", this);} // tgen
ccc::EE0x8 ::EE0x8(){ note_ctor("_ZN3ccc5EE0x8E", this);} // tgen
}
static void Test__ZN3ccc5EE0x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x8E, buf);
    ::ccc::EE0x8 *dp, &lv = *(dp=new (buf) ::ccc::EE0x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x8E);
    dp->::ccc::EE0x8::~EE0x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x8E(Test__ZN3ccc5EE0x8E, "_ZN3ccc5EE0x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x8C1Ev();
extern void _ZN3ccc5EE0x8D1Ev();
Name_Map name_map__ZN3ccc5EE0x8E[] = {
  NSPAIR(_ZN3ccc5EE0x8C1Ev),
  NSPAIR(_ZN3ccc5EE0x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x8E[];
extern void _ZN3ccc5EE0x83abcEv();
extern void _ZN3ccc5EE0x83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x8E[] = {
  {&(_ZTVN3ccc5EE0x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
Class_Descriptor cd__ZN3ccc5EE0x8E = {  "_ZN3ccc5EE0x8E", // class name
  bases__ZN3ccc5EE0x8E, 1,
  &(vtc__ZN3ccc5EE0x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x8E),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
namespace ccc { 
struct  EE0x9  : virtual ::ccc::AA0 {
  virtual void  efg(); // _ZN3ccc5EE0x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE0x93pqrEv
  ~EE0x9(); // tgen
  EE0x9(); // tgen
};
//SIG(-1 _ZN3ccc5EE0x9E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE0x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE0x93efgEv");}
void  ccc::EE0x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE0x93pqrEv");}
ccc::EE0x9 ::~EE0x9(){ note_dtor("_ZN3ccc5EE0x9E", this);} // tgen
ccc::EE0x9 ::EE0x9(){ note_ctor("_ZN3ccc5EE0x9E", this);} // tgen
}
static void Test__ZN3ccc5EE0x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE0x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE0x9E, buf);
    ::ccc::EE0x9 *dp, &lv = *(dp=new (buf) ::ccc::EE0x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE0x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE0x9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc5EE0x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE0x9E);
    dp->::ccc::EE0x9::~EE0x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE0x9E(Test__ZN3ccc5EE0x9E, "_ZN3ccc5EE0x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE0x9C1Ev();
extern void _ZN3ccc5EE0x9D1Ev();
Name_Map name_map__ZN3ccc5EE0x9E[] = {
  NSPAIR(_ZN3ccc5EE0x9C1Ev),
  NSPAIR(_ZN3ccc5EE0x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc5EE0x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE0x9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc5EE0x93efgEv();
extern void _ZN3ccc5EE0x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE0x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE0x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE0x9E[] = {
  {&(_ZTVN3ccc5EE0x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE0x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
Class_Descriptor cd__ZN3ccc5EE0x9E = {  "_ZN3ccc5EE0x9E", // class name
  bases__ZN3ccc5EE0x9E, 1,
  &(vtc__ZN3ccc5EE0x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE0x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE0x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE0x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE0x9E),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
namespace ccc { 
struct  EE0x10  : virtual ::ccc::AA0 {
  virtual void  pqr(); // _ZN3ccc6EE0x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE0x103abcEv
  ~EE0x10(); // tgen
  EE0x10(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x10E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE0x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE0x103pqrEv");}
void  ccc::EE0x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE0x103abcEv");}
ccc::EE0x10 ::~EE0x10(){ note_dtor("_ZN3ccc6EE0x10E", this);} // tgen
ccc::EE0x10 ::EE0x10(){ note_ctor("_ZN3ccc6EE0x10E", this);} // tgen
}
static void Test__ZN3ccc6EE0x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x10E, buf);
    ::ccc::EE0x10 *dp, &lv = *(dp=new (buf) ::ccc::EE0x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x10E);
    dp->::ccc::EE0x10::~EE0x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x10E(Test__ZN3ccc6EE0x10E, "_ZN3ccc6EE0x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x10C1Ev();
extern void _ZN3ccc6EE0x10D1Ev();
Name_Map name_map__ZN3ccc6EE0x10E[] = {
  NSPAIR(_ZN3ccc6EE0x10C1Ev),
  NSPAIR(_ZN3ccc6EE0x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x10E[];
extern void _ZN3ccc6EE0x103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc6EE0x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE0x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x10E[] = {
  {&(_ZTVN3ccc6EE0x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
Class_Descriptor cd__ZN3ccc6EE0x10E = {  "_ZN3ccc6EE0x10E", // class name
  bases__ZN3ccc6EE0x10E, 1,
  &(vtc__ZN3ccc6EE0x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x10E),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
namespace ccc { 
struct  EE0x11  : virtual ::ccc::AA0 {
  virtual void  pqr(); // _ZN3ccc6EE0x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE0x113efgEv
  ~EE0x11(); // tgen
  EE0x11(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x11E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE0x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE0x113pqrEv");}
void  ccc::EE0x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE0x113efgEv");}
ccc::EE0x11 ::~EE0x11(){ note_dtor("_ZN3ccc6EE0x11E", this);} // tgen
ccc::EE0x11 ::EE0x11(){ note_ctor("_ZN3ccc6EE0x11E", this);} // tgen
}
static void Test__ZN3ccc6EE0x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x11E, buf);
    ::ccc::EE0x11 *dp, &lv = *(dp=new (buf) ::ccc::EE0x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x11E);
    dp->::ccc::EE0x11::~EE0x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x11E(Test__ZN3ccc6EE0x11E, "_ZN3ccc6EE0x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x11C1Ev();
extern void _ZN3ccc6EE0x11D1Ev();
Name_Map name_map__ZN3ccc6EE0x11E[] = {
  NSPAIR(_ZN3ccc6EE0x11C1Ev),
  NSPAIR(_ZN3ccc6EE0x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc6EE0x113efgEv();
extern void _ZN3ccc6EE0x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE0x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x11E[] = {
  {&(_ZTVN3ccc6EE0x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
Class_Descriptor cd__ZN3ccc6EE0x11E = {  "_ZN3ccc6EE0x11E", // class name
  bases__ZN3ccc6EE0x11E, 1,
  &(vtc__ZN3ccc6EE0x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x11E),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
namespace ccc { 
struct  EE0x12  : virtual ::ccc::AA0 {
  virtual void  abc(); // _ZN3ccc6EE0x123abcEv
  ~EE0x12(); // tgen
  EE0x12(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x12E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE0x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE0x123abcEv");}
ccc::EE0x12 ::~EE0x12(){ note_dtor("_ZN3ccc6EE0x12E", this);} // tgen
ccc::EE0x12 ::EE0x12(){ note_ctor("_ZN3ccc6EE0x12E", this);} // tgen
}
static void Test__ZN3ccc6EE0x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x12E, buf);
    ::ccc::EE0x12 *dp, &lv = *(dp=new (buf) ::ccc::EE0x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x12E);
    dp->::ccc::EE0x12::~EE0x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x12E(Test__ZN3ccc6EE0x12E, "_ZN3ccc6EE0x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x12C1Ev();
extern void _ZN3ccc6EE0x12D1Ev();
Name_Map name_map__ZN3ccc6EE0x12E[] = {
  NSPAIR(_ZN3ccc6EE0x12C1Ev),
  NSPAIR(_ZN3ccc6EE0x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x12E[];
extern void _ZN3ccc6EE0x123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x12E[] = {
  {&(_ZTVN3ccc6EE0x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
Class_Descriptor cd__ZN3ccc6EE0x12E = {  "_ZN3ccc6EE0x12E", // class name
  bases__ZN3ccc6EE0x12E, 1,
  &(vtc__ZN3ccc6EE0x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x12E),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
namespace ccc { 
struct  EE0x13  : virtual ::ccc::AA0 {
  virtual void  efg(); // _ZN3ccc6EE0x133efgEv
  ~EE0x13(); // tgen
  EE0x13(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x13E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE0x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE0x133efgEv");}
ccc::EE0x13 ::~EE0x13(){ note_dtor("_ZN3ccc6EE0x13E", this);} // tgen
ccc::EE0x13 ::EE0x13(){ note_ctor("_ZN3ccc6EE0x13E", this);} // tgen
}
static void Test__ZN3ccc6EE0x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x13E, buf);
    ::ccc::EE0x13 *dp, &lv = *(dp=new (buf) ::ccc::EE0x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x13E);
    dp->::ccc::EE0x13::~EE0x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x13E(Test__ZN3ccc6EE0x13E, "_ZN3ccc6EE0x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x13C1Ev();
extern void _ZN3ccc6EE0x13D1Ev();
Name_Map name_map__ZN3ccc6EE0x13E[] = {
  NSPAIR(_ZN3ccc6EE0x13C1Ev),
  NSPAIR(_ZN3ccc6EE0x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc6EE0x133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x13E[] = {
  {&(_ZTVN3ccc6EE0x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
Class_Descriptor cd__ZN3ccc6EE0x13E = {  "_ZN3ccc6EE0x13E", // class name
  bases__ZN3ccc6EE0x13E, 1,
  &(vtc__ZN3ccc6EE0x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x13E),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
namespace ccc { 
struct  EE0x14  : virtual ::ccc::AA0 {
  virtual void  pqr(); // _ZN3ccc6EE0x143pqrEv
  ~EE0x14(); // tgen
  EE0x14(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x14E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE0x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE0x143pqrEv");}
ccc::EE0x14 ::~EE0x14(){ note_dtor("_ZN3ccc6EE0x14E", this);} // tgen
ccc::EE0x14 ::EE0x14(){ note_ctor("_ZN3ccc6EE0x14E", this);} // tgen
}
static void Test__ZN3ccc6EE0x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x14E, buf);
    ::ccc::EE0x14 *dp, &lv = *(dp=new (buf) ::ccc::EE0x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x14E);
    dp->::ccc::EE0x14::~EE0x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x14E(Test__ZN3ccc6EE0x14E, "_ZN3ccc6EE0x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x14C1Ev();
extern void _ZN3ccc6EE0x14D1Ev();
Name_Map name_map__ZN3ccc6EE0x14E[] = {
  NSPAIR(_ZN3ccc6EE0x14C1Ev),
  NSPAIR(_ZN3ccc6EE0x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc6EE0x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE0x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x14E[] = {
  {&(_ZTVN3ccc6EE0x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
Class_Descriptor cd__ZN3ccc6EE0x14E = {  "_ZN3ccc6EE0x14E", // class name
  bases__ZN3ccc6EE0x14E, 1,
  &(vtc__ZN3ccc6EE0x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x14E),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
namespace ccc { 
struct  EE0x15  : virtual ::ccc::AA0 {
  ~EE0x15(); // tgen
  EE0x15(); // tgen
};
//SIG(-1 _ZN3ccc6EE0x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE0x15 ::~EE0x15(){ note_dtor("_ZN3ccc6EE0x15E", this);} // tgen
ccc::EE0x15 ::EE0x15(){ note_ctor("_ZN3ccc6EE0x15E", this);} // tgen
}
static void Test__ZN3ccc6EE0x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE0x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE0x15E, buf);
    ::ccc::EE0x15 *dp, &lv = *(dp=new (buf) ::ccc::EE0x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE0x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE0x15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc6EE0x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE0x15E);
    dp->::ccc::EE0x15::~EE0x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE0x15E(Test__ZN3ccc6EE0x15E, "_ZN3ccc6EE0x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE0x15C1Ev();
extern void _ZN3ccc6EE0x15D1Ev();
Name_Map name_map__ZN3ccc6EE0x15E[] = {
  NSPAIR(_ZN3ccc6EE0x15C1Ev),
  NSPAIR(_ZN3ccc6EE0x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
static Base_Class bases__ZN3ccc6EE0x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE0x15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE0x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE0x15E[] = {
  {&(_ZTVN3ccc6EE0x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE0x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
Class_Descriptor cd__ZN3ccc6EE0x15E = {  "_ZN3ccc6EE0x15E", // class name
  bases__ZN3ccc6EE0x15E, 1,
  &(vtc__ZN3ccc6EE0x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE0x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE0x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE0x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE0x15E),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
namespace ccc { 
struct  AA1  {
  virtual void  abc(); // _ZN3ccc3AA13abcEv
  virtual void  pqr(); // _ZN3ccc3AA13pqrEv
  virtual void  efg(); // _ZN3ccc3AA13efgEv
  ~AA1(); // tgen
  AA1(); // tgen
};
//SIG(-1 _ZN3ccc3AA1E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA1 ::abc(){vfunc_called(this, "_ZN3ccc3AA13abcEv");}
void  ccc::AA1 ::pqr(){vfunc_called(this, "_ZN3ccc3AA13pqrEv");}
void  ccc::AA1 ::efg(){vfunc_called(this, "_ZN3ccc3AA13efgEv");}
ccc::AA1 ::~AA1(){ note_dtor("_ZN3ccc3AA1E", this);} // tgen
ccc::AA1 ::AA1(){ note_ctor("_ZN3ccc3AA1E", this);} // tgen
}
static void Test__ZN3ccc3AA1E()
{
  extern Class_Descriptor cd__ZN3ccc3AA1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA1E, buf);
    ::ccc::AA1 *dp, &lv = *(dp=new (buf) ::ccc::AA1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA1E)");
    test_class_info(&lv, &cd__ZN3ccc3AA1E);
    dp->::ccc::AA1::~AA1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA1E(Test__ZN3ccc3AA1E, "_ZN3ccc3AA1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA1C1Ev();
extern void _ZN3ccc3AA1D1Ev();
Name_Map name_map__ZN3ccc3AA1E[] = {
  NSPAIR(_ZN3ccc3AA1C1Ev),
  NSPAIR(_ZN3ccc3AA1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA1E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
Class_Descriptor cd__ZN3ccc3AA1E = {  "_ZN3ccc3AA1E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA1E),5, //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
namespace ccc { 
struct  BB1  {
  virtual void  abc(); // _ZN3ccc3BB13abcEv
  virtual void  pqr(); // _ZN3ccc3BB13pqrEv
  virtual void  efg(); // _ZN3ccc3BB13efgEv
  ~BB1(); // tgen
  BB1(); // tgen
};
//SIG(1 _ZN3ccc3BB1E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB1 ::abc(){vfunc_called(this, "_ZN3ccc3BB13abcEv");}
void  ccc::BB1 ::pqr(){vfunc_called(this, "_ZN3ccc3BB13pqrEv");}
void  ccc::BB1 ::efg(){vfunc_called(this, "_ZN3ccc3BB13efgEv");}
ccc::BB1 ::~BB1(){ note_dtor("_ZN3ccc3BB1E", this);} // tgen
ccc::BB1 ::BB1(){ note_ctor("_ZN3ccc3BB1E", this);} // tgen
}
static void Test__ZN3ccc3BB1E()
{
  extern Class_Descriptor cd__ZN3ccc3BB1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB1E, buf);
    ::ccc::BB1 *dp, &lv = *(dp=new (buf) ::ccc::BB1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB1E)");
    test_class_info(&lv, &cd__ZN3ccc3BB1E);
    dp->::ccc::BB1::~BB1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB1E(Test__ZN3ccc3BB1E, "_ZN3ccc3BB1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB1C1Ev();
extern void _ZN3ccc3BB1D1Ev();
Name_Map name_map__ZN3ccc3BB1E[] = {
  NSPAIR(_ZN3ccc3BB1C1Ev),
  NSPAIR(_ZN3ccc3BB1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB1E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
Class_Descriptor cd__ZN3ccc3BB1E = {  "_ZN3ccc3BB1E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB1E),5, //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
namespace ccc { 
struct  EE1x0  : virtual ::ccc::AA1 {
  virtual void  abc(); // _ZN3ccc5EE1x03abcEv
  virtual void  efg(); // _ZN3ccc5EE1x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE1x03pqrEv
  ~EE1x0(); // tgen
  EE1x0(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x0E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x03abcEv");}
void  ccc::EE1x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x03efgEv");}
void  ccc::EE1x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x03pqrEv");}
ccc::EE1x0 ::~EE1x0(){ note_dtor("_ZN3ccc5EE1x0E", this);} // tgen
ccc::EE1x0 ::EE1x0(){ note_ctor("_ZN3ccc5EE1x0E", this);} // tgen
}
static void Test__ZN3ccc5EE1x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x0E, buf);
    ::ccc::EE1x0 *dp, &lv = *(dp=new (buf) ::ccc::EE1x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x0E);
    dp->::ccc::EE1x0::~EE1x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x0E(Test__ZN3ccc5EE1x0E, "_ZN3ccc5EE1x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x0C1Ev();
extern void _ZN3ccc5EE1x0D1Ev();
Name_Map name_map__ZN3ccc5EE1x0E[] = {
  NSPAIR(_ZN3ccc5EE1x0C1Ev),
  NSPAIR(_ZN3ccc5EE1x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x0E[];
extern void _ZN3ccc5EE1x03abcEv();
extern void _ZN3ccc5EE1x03pqrEv();
extern void _ZN3ccc5EE1x03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x0E[] = {
  {&(_ZTVN3ccc5EE1x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
Class_Descriptor cd__ZN3ccc5EE1x0E = {  "_ZN3ccc5EE1x0E", // class name
  bases__ZN3ccc5EE1x0E, 1,
  &(vtc__ZN3ccc5EE1x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x0E),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
namespace ccc { 
struct  EE1x1  : virtual ::ccc::AA1 {
  virtual void  abc(); // _ZN3ccc5EE1x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE1x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE1x13efgEv
  ~EE1x1(); // tgen
  EE1x1(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x1E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x13abcEv");}
void  ccc::EE1x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x13pqrEv");}
void  ccc::EE1x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x13efgEv");}
ccc::EE1x1 ::~EE1x1(){ note_dtor("_ZN3ccc5EE1x1E", this);} // tgen
ccc::EE1x1 ::EE1x1(){ note_ctor("_ZN3ccc5EE1x1E", this);} // tgen
}
static void Test__ZN3ccc5EE1x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x1E, buf);
    ::ccc::EE1x1 *dp, &lv = *(dp=new (buf) ::ccc::EE1x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x1E);
    dp->::ccc::EE1x1::~EE1x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x1E(Test__ZN3ccc5EE1x1E, "_ZN3ccc5EE1x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x1C1Ev();
extern void _ZN3ccc5EE1x1D1Ev();
Name_Map name_map__ZN3ccc5EE1x1E[] = {
  NSPAIR(_ZN3ccc5EE1x1C1Ev),
  NSPAIR(_ZN3ccc5EE1x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x1E[];
extern void _ZN3ccc5EE1x13abcEv();
extern void _ZN3ccc5EE1x13pqrEv();
extern void _ZN3ccc5EE1x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x1E[] = {
  {&(_ZTVN3ccc5EE1x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
Class_Descriptor cd__ZN3ccc5EE1x1E = {  "_ZN3ccc5EE1x1E", // class name
  bases__ZN3ccc5EE1x1E, 1,
  &(vtc__ZN3ccc5EE1x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x1E),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
namespace ccc { 
struct  EE1x2  : virtual ::ccc::AA1 {
  virtual void  efg(); // _ZN3ccc5EE1x23efgEv
  virtual void  abc(); // _ZN3ccc5EE1x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE1x23pqrEv
  ~EE1x2(); // tgen
  EE1x2(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x2E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x23efgEv");}
void  ccc::EE1x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x23abcEv");}
void  ccc::EE1x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x23pqrEv");}
ccc::EE1x2 ::~EE1x2(){ note_dtor("_ZN3ccc5EE1x2E", this);} // tgen
ccc::EE1x2 ::EE1x2(){ note_ctor("_ZN3ccc5EE1x2E", this);} // tgen
}
static void Test__ZN3ccc5EE1x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x2E, buf);
    ::ccc::EE1x2 *dp, &lv = *(dp=new (buf) ::ccc::EE1x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x2E);
    dp->::ccc::EE1x2::~EE1x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x2E(Test__ZN3ccc5EE1x2E, "_ZN3ccc5EE1x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x2C1Ev();
extern void _ZN3ccc5EE1x2D1Ev();
Name_Map name_map__ZN3ccc5EE1x2E[] = {
  NSPAIR(_ZN3ccc5EE1x2C1Ev),
  NSPAIR(_ZN3ccc5EE1x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x2E[];
extern void _ZN3ccc5EE1x23abcEv();
extern void _ZN3ccc5EE1x23pqrEv();
extern void _ZN3ccc5EE1x23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x2E[] = {
  {&(_ZTVN3ccc5EE1x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
Class_Descriptor cd__ZN3ccc5EE1x2E = {  "_ZN3ccc5EE1x2E", // class name
  bases__ZN3ccc5EE1x2E, 1,
  &(vtc__ZN3ccc5EE1x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x2E),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
namespace ccc { 
struct  EE1x3  : virtual ::ccc::AA1 {
  virtual void  efg(); // _ZN3ccc5EE1x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE1x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE1x33abcEv
  ~EE1x3(); // tgen
  EE1x3(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x3E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x33efgEv");}
void  ccc::EE1x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x33pqrEv");}
void  ccc::EE1x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x33abcEv");}
ccc::EE1x3 ::~EE1x3(){ note_dtor("_ZN3ccc5EE1x3E", this);} // tgen
ccc::EE1x3 ::EE1x3(){ note_ctor("_ZN3ccc5EE1x3E", this);} // tgen
}
static void Test__ZN3ccc5EE1x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x3E, buf);
    ::ccc::EE1x3 *dp, &lv = *(dp=new (buf) ::ccc::EE1x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x3E);
    dp->::ccc::EE1x3::~EE1x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x3E(Test__ZN3ccc5EE1x3E, "_ZN3ccc5EE1x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x3C1Ev();
extern void _ZN3ccc5EE1x3D1Ev();
Name_Map name_map__ZN3ccc5EE1x3E[] = {
  NSPAIR(_ZN3ccc5EE1x3C1Ev),
  NSPAIR(_ZN3ccc5EE1x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x3E[];
extern void _ZN3ccc5EE1x33abcEv();
extern void _ZN3ccc5EE1x33pqrEv();
extern void _ZN3ccc5EE1x33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x3E[] = {
  {&(_ZTVN3ccc5EE1x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
Class_Descriptor cd__ZN3ccc5EE1x3E = {  "_ZN3ccc5EE1x3E", // class name
  bases__ZN3ccc5EE1x3E, 1,
  &(vtc__ZN3ccc5EE1x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x3E),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
namespace ccc { 
struct  EE1x4  : virtual ::ccc::AA1 {
  virtual void  pqr(); // _ZN3ccc5EE1x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE1x43abcEv
  virtual void  efg(); // _ZN3ccc5EE1x43efgEv
  ~EE1x4(); // tgen
  EE1x4(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x4E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x43pqrEv");}
void  ccc::EE1x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x43abcEv");}
void  ccc::EE1x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x43efgEv");}
ccc::EE1x4 ::~EE1x4(){ note_dtor("_ZN3ccc5EE1x4E", this);} // tgen
ccc::EE1x4 ::EE1x4(){ note_ctor("_ZN3ccc5EE1x4E", this);} // tgen
}
static void Test__ZN3ccc5EE1x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x4E, buf);
    ::ccc::EE1x4 *dp, &lv = *(dp=new (buf) ::ccc::EE1x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x4E);
    dp->::ccc::EE1x4::~EE1x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x4E(Test__ZN3ccc5EE1x4E, "_ZN3ccc5EE1x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x4C1Ev();
extern void _ZN3ccc5EE1x4D1Ev();
Name_Map name_map__ZN3ccc5EE1x4E[] = {
  NSPAIR(_ZN3ccc5EE1x4C1Ev),
  NSPAIR(_ZN3ccc5EE1x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x4E[];
extern void _ZN3ccc5EE1x43abcEv();
extern void _ZN3ccc5EE1x43pqrEv();
extern void _ZN3ccc5EE1x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x4E[] = {
  {&(_ZTVN3ccc5EE1x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
Class_Descriptor cd__ZN3ccc5EE1x4E = {  "_ZN3ccc5EE1x4E", // class name
  bases__ZN3ccc5EE1x4E, 1,
  &(vtc__ZN3ccc5EE1x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x4E),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
namespace ccc { 
struct  EE1x5  : virtual ::ccc::AA1 {
  virtual void  pqr(); // _ZN3ccc5EE1x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE1x53efgEv
  virtual void  abc(); // _ZN3ccc5EE1x53abcEv
  ~EE1x5(); // tgen
  EE1x5(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x5E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE1x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x53pqrEv");}
void  ccc::EE1x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x53efgEv");}
void  ccc::EE1x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x53abcEv");}
ccc::EE1x5 ::~EE1x5(){ note_dtor("_ZN3ccc5EE1x5E", this);} // tgen
ccc::EE1x5 ::EE1x5(){ note_ctor("_ZN3ccc5EE1x5E", this);} // tgen
}
static void Test__ZN3ccc5EE1x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x5E, buf);
    ::ccc::EE1x5 *dp, &lv = *(dp=new (buf) ::ccc::EE1x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x5E);
    dp->::ccc::EE1x5::~EE1x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x5E(Test__ZN3ccc5EE1x5E, "_ZN3ccc5EE1x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x5C1Ev();
extern void _ZN3ccc5EE1x5D1Ev();
Name_Map name_map__ZN3ccc5EE1x5E[] = {
  NSPAIR(_ZN3ccc5EE1x5C1Ev),
  NSPAIR(_ZN3ccc5EE1x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x5E[];
extern void _ZN3ccc5EE1x53abcEv();
extern void _ZN3ccc5EE1x53pqrEv();
extern void _ZN3ccc5EE1x53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x5E[] = {
  {&(_ZTVN3ccc5EE1x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
Class_Descriptor cd__ZN3ccc5EE1x5E = {  "_ZN3ccc5EE1x5E", // class name
  bases__ZN3ccc5EE1x5E, 1,
  &(vtc__ZN3ccc5EE1x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x5E),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
namespace ccc { 
struct  EE1x6  : virtual ::ccc::AA1 {
  virtual void  abc(); // _ZN3ccc5EE1x63abcEv
  virtual void  efg(); // _ZN3ccc5EE1x63efgEv
  ~EE1x6(); // tgen
  EE1x6(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x6E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE1x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x63abcEv");}
void  ccc::EE1x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x63efgEv");}
ccc::EE1x6 ::~EE1x6(){ note_dtor("_ZN3ccc5EE1x6E", this);} // tgen
ccc::EE1x6 ::EE1x6(){ note_ctor("_ZN3ccc5EE1x6E", this);} // tgen
}
static void Test__ZN3ccc5EE1x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x6E, buf);
    ::ccc::EE1x6 *dp, &lv = *(dp=new (buf) ::ccc::EE1x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x6E);
    dp->::ccc::EE1x6::~EE1x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x6E(Test__ZN3ccc5EE1x6E, "_ZN3ccc5EE1x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x6C1Ev();
extern void _ZN3ccc5EE1x6D1Ev();
Name_Map name_map__ZN3ccc5EE1x6E[] = {
  NSPAIR(_ZN3ccc5EE1x6C1Ev),
  NSPAIR(_ZN3ccc5EE1x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x6E[];
extern void _ZN3ccc5EE1x63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc5EE1x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x6E[] = {
  {&(_ZTVN3ccc5EE1x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
Class_Descriptor cd__ZN3ccc5EE1x6E = {  "_ZN3ccc5EE1x6E", // class name
  bases__ZN3ccc5EE1x6E, 1,
  &(vtc__ZN3ccc5EE1x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x6E),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
namespace ccc { 
struct  EE1x7  : virtual ::ccc::AA1 {
  virtual void  abc(); // _ZN3ccc5EE1x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE1x73pqrEv
  ~EE1x7(); // tgen
  EE1x7(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x7E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE1x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x73abcEv");}
void  ccc::EE1x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x73pqrEv");}
ccc::EE1x7 ::~EE1x7(){ note_dtor("_ZN3ccc5EE1x7E", this);} // tgen
ccc::EE1x7 ::EE1x7(){ note_ctor("_ZN3ccc5EE1x7E", this);} // tgen
}
static void Test__ZN3ccc5EE1x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x7E, buf);
    ::ccc::EE1x7 *dp, &lv = *(dp=new (buf) ::ccc::EE1x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x7E);
    dp->::ccc::EE1x7::~EE1x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x7E(Test__ZN3ccc5EE1x7E, "_ZN3ccc5EE1x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x7C1Ev();
extern void _ZN3ccc5EE1x7D1Ev();
Name_Map name_map__ZN3ccc5EE1x7E[] = {
  NSPAIR(_ZN3ccc5EE1x7C1Ev),
  NSPAIR(_ZN3ccc5EE1x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x7E[];
extern void _ZN3ccc5EE1x73abcEv();
extern void _ZN3ccc5EE1x73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x7E[] = {
  {&(_ZTVN3ccc5EE1x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
Class_Descriptor cd__ZN3ccc5EE1x7E = {  "_ZN3ccc5EE1x7E", // class name
  bases__ZN3ccc5EE1x7E, 1,
  &(vtc__ZN3ccc5EE1x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x7E),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
namespace ccc { 
struct  EE1x8  : virtual ::ccc::AA1 {
  virtual void  efg(); // _ZN3ccc5EE1x83efgEv
  virtual void  abc(); // _ZN3ccc5EE1x83abcEv
  ~EE1x8(); // tgen
  EE1x8(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x8E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE1x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x83efgEv");}
void  ccc::EE1x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE1x83abcEv");}
ccc::EE1x8 ::~EE1x8(){ note_dtor("_ZN3ccc5EE1x8E", this);} // tgen
ccc::EE1x8 ::EE1x8(){ note_ctor("_ZN3ccc5EE1x8E", this);} // tgen
}
static void Test__ZN3ccc5EE1x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x8E, buf);
    ::ccc::EE1x8 *dp, &lv = *(dp=new (buf) ::ccc::EE1x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x8E);
    dp->::ccc::EE1x8::~EE1x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x8E(Test__ZN3ccc5EE1x8E, "_ZN3ccc5EE1x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x8C1Ev();
extern void _ZN3ccc5EE1x8D1Ev();
Name_Map name_map__ZN3ccc5EE1x8E[] = {
  NSPAIR(_ZN3ccc5EE1x8C1Ev),
  NSPAIR(_ZN3ccc5EE1x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x8E[];
extern void _ZN3ccc5EE1x83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc5EE1x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x8E[] = {
  {&(_ZTVN3ccc5EE1x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
Class_Descriptor cd__ZN3ccc5EE1x8E = {  "_ZN3ccc5EE1x8E", // class name
  bases__ZN3ccc5EE1x8E, 1,
  &(vtc__ZN3ccc5EE1x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x8E),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
namespace ccc { 
struct  EE1x9  : virtual ::ccc::AA1 {
  virtual void  efg(); // _ZN3ccc5EE1x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE1x93pqrEv
  ~EE1x9(); // tgen
  EE1x9(); // tgen
};
//SIG(-1 _ZN3ccc5EE1x9E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE1x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE1x93efgEv");}
void  ccc::EE1x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE1x93pqrEv");}
ccc::EE1x9 ::~EE1x9(){ note_dtor("_ZN3ccc5EE1x9E", this);} // tgen
ccc::EE1x9 ::EE1x9(){ note_ctor("_ZN3ccc5EE1x9E", this);} // tgen
}
static void Test__ZN3ccc5EE1x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE1x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE1x9E, buf);
    ::ccc::EE1x9 *dp, &lv = *(dp=new (buf) ::ccc::EE1x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE1x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE1x9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc5EE1x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE1x9E);
    dp->::ccc::EE1x9::~EE1x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE1x9E(Test__ZN3ccc5EE1x9E, "_ZN3ccc5EE1x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE1x9C1Ev();
extern void _ZN3ccc5EE1x9D1Ev();
Name_Map name_map__ZN3ccc5EE1x9E[] = {
  NSPAIR(_ZN3ccc5EE1x9C1Ev),
  NSPAIR(_ZN3ccc5EE1x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc5EE1x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE1x9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc5EE1x93pqrEv();
extern void _ZN3ccc5EE1x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE1x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE1x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE1x9E[] = {
  {&(_ZTVN3ccc5EE1x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE1x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
Class_Descriptor cd__ZN3ccc5EE1x9E = {  "_ZN3ccc5EE1x9E", // class name
  bases__ZN3ccc5EE1x9E, 1,
  &(vtc__ZN3ccc5EE1x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE1x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE1x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE1x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE1x9E),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
namespace ccc { 
struct  EE1x10  : virtual ::ccc::AA1 {
  virtual void  pqr(); // _ZN3ccc6EE1x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE1x103abcEv
  ~EE1x10(); // tgen
  EE1x10(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x10E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE1x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE1x103pqrEv");}
void  ccc::EE1x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE1x103abcEv");}
ccc::EE1x10 ::~EE1x10(){ note_dtor("_ZN3ccc6EE1x10E", this);} // tgen
ccc::EE1x10 ::EE1x10(){ note_ctor("_ZN3ccc6EE1x10E", this);} // tgen
}
static void Test__ZN3ccc6EE1x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x10E, buf);
    ::ccc::EE1x10 *dp, &lv = *(dp=new (buf) ::ccc::EE1x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x10E);
    dp->::ccc::EE1x10::~EE1x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x10E(Test__ZN3ccc6EE1x10E, "_ZN3ccc6EE1x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x10C1Ev();
extern void _ZN3ccc6EE1x10D1Ev();
Name_Map name_map__ZN3ccc6EE1x10E[] = {
  NSPAIR(_ZN3ccc6EE1x10C1Ev),
  NSPAIR(_ZN3ccc6EE1x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x10E[];
extern void _ZN3ccc6EE1x103abcEv();
extern void _ZN3ccc6EE1x103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x10E[] = {
  {&(_ZTVN3ccc6EE1x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
Class_Descriptor cd__ZN3ccc6EE1x10E = {  "_ZN3ccc6EE1x10E", // class name
  bases__ZN3ccc6EE1x10E, 1,
  &(vtc__ZN3ccc6EE1x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x10E),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
namespace ccc { 
struct  EE1x11  : virtual ::ccc::AA1 {
  virtual void  pqr(); // _ZN3ccc6EE1x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE1x113efgEv
  ~EE1x11(); // tgen
  EE1x11(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x11E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE1x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE1x113pqrEv");}
void  ccc::EE1x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE1x113efgEv");}
ccc::EE1x11 ::~EE1x11(){ note_dtor("_ZN3ccc6EE1x11E", this);} // tgen
ccc::EE1x11 ::EE1x11(){ note_ctor("_ZN3ccc6EE1x11E", this);} // tgen
}
static void Test__ZN3ccc6EE1x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x11E, buf);
    ::ccc::EE1x11 *dp, &lv = *(dp=new (buf) ::ccc::EE1x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x11E);
    dp->::ccc::EE1x11::~EE1x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x11E(Test__ZN3ccc6EE1x11E, "_ZN3ccc6EE1x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x11C1Ev();
extern void _ZN3ccc6EE1x11D1Ev();
Name_Map name_map__ZN3ccc6EE1x11E[] = {
  NSPAIR(_ZN3ccc6EE1x11C1Ev),
  NSPAIR(_ZN3ccc6EE1x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc6EE1x113pqrEv();
extern void _ZN3ccc6EE1x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE1x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x11E[] = {
  {&(_ZTVN3ccc6EE1x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
Class_Descriptor cd__ZN3ccc6EE1x11E = {  "_ZN3ccc6EE1x11E", // class name
  bases__ZN3ccc6EE1x11E, 1,
  &(vtc__ZN3ccc6EE1x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x11E),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
namespace ccc { 
struct  EE1x12  : virtual ::ccc::AA1 {
  virtual void  abc(); // _ZN3ccc6EE1x123abcEv
  ~EE1x12(); // tgen
  EE1x12(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x12E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE1x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE1x123abcEv");}
ccc::EE1x12 ::~EE1x12(){ note_dtor("_ZN3ccc6EE1x12E", this);} // tgen
ccc::EE1x12 ::EE1x12(){ note_ctor("_ZN3ccc6EE1x12E", this);} // tgen
}
static void Test__ZN3ccc6EE1x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x12E, buf);
    ::ccc::EE1x12 *dp, &lv = *(dp=new (buf) ::ccc::EE1x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x12E);
    dp->::ccc::EE1x12::~EE1x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x12E(Test__ZN3ccc6EE1x12E, "_ZN3ccc6EE1x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x12C1Ev();
extern void _ZN3ccc6EE1x12D1Ev();
Name_Map name_map__ZN3ccc6EE1x12E[] = {
  NSPAIR(_ZN3ccc6EE1x12C1Ev),
  NSPAIR(_ZN3ccc6EE1x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x12E[];
extern void _ZN3ccc6EE1x123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x12E[] = {
  {&(_ZTVN3ccc6EE1x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
Class_Descriptor cd__ZN3ccc6EE1x12E = {  "_ZN3ccc6EE1x12E", // class name
  bases__ZN3ccc6EE1x12E, 1,
  &(vtc__ZN3ccc6EE1x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x12E),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
namespace ccc { 
struct  EE1x13  : virtual ::ccc::AA1 {
  virtual void  efg(); // _ZN3ccc6EE1x133efgEv
  ~EE1x13(); // tgen
  EE1x13(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x13E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE1x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE1x133efgEv");}
ccc::EE1x13 ::~EE1x13(){ note_dtor("_ZN3ccc6EE1x13E", this);} // tgen
ccc::EE1x13 ::EE1x13(){ note_ctor("_ZN3ccc6EE1x13E", this);} // tgen
}
static void Test__ZN3ccc6EE1x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x13E, buf);
    ::ccc::EE1x13 *dp, &lv = *(dp=new (buf) ::ccc::EE1x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x13E);
    dp->::ccc::EE1x13::~EE1x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x13E(Test__ZN3ccc6EE1x13E, "_ZN3ccc6EE1x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x13C1Ev();
extern void _ZN3ccc6EE1x13D1Ev();
Name_Map name_map__ZN3ccc6EE1x13E[] = {
  NSPAIR(_ZN3ccc6EE1x13C1Ev),
  NSPAIR(_ZN3ccc6EE1x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc6EE1x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE1x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x13E[] = {
  {&(_ZTVN3ccc6EE1x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
Class_Descriptor cd__ZN3ccc6EE1x13E = {  "_ZN3ccc6EE1x13E", // class name
  bases__ZN3ccc6EE1x13E, 1,
  &(vtc__ZN3ccc6EE1x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x13E),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
namespace ccc { 
struct  EE1x14  : virtual ::ccc::AA1 {
  virtual void  pqr(); // _ZN3ccc6EE1x143pqrEv
  ~EE1x14(); // tgen
  EE1x14(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x14E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE1x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE1x143pqrEv");}
ccc::EE1x14 ::~EE1x14(){ note_dtor("_ZN3ccc6EE1x14E", this);} // tgen
ccc::EE1x14 ::EE1x14(){ note_ctor("_ZN3ccc6EE1x14E", this);} // tgen
}
static void Test__ZN3ccc6EE1x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x14E, buf);
    ::ccc::EE1x14 *dp, &lv = *(dp=new (buf) ::ccc::EE1x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x14E);
    dp->::ccc::EE1x14::~EE1x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x14E(Test__ZN3ccc6EE1x14E, "_ZN3ccc6EE1x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x14C1Ev();
extern void _ZN3ccc6EE1x14D1Ev();
Name_Map name_map__ZN3ccc6EE1x14E[] = {
  NSPAIR(_ZN3ccc6EE1x14C1Ev),
  NSPAIR(_ZN3ccc6EE1x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc6EE1x143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x14E[] = {
  {&(_ZTVN3ccc6EE1x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
Class_Descriptor cd__ZN3ccc6EE1x14E = {  "_ZN3ccc6EE1x14E", // class name
  bases__ZN3ccc6EE1x14E, 1,
  &(vtc__ZN3ccc6EE1x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x14E),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
namespace ccc { 
struct  EE1x15  : virtual ::ccc::AA1 {
  ~EE1x15(); // tgen
  EE1x15(); // tgen
};
//SIG(-1 _ZN3ccc6EE1x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE1x15 ::~EE1x15(){ note_dtor("_ZN3ccc6EE1x15E", this);} // tgen
ccc::EE1x15 ::EE1x15(){ note_ctor("_ZN3ccc6EE1x15E", this);} // tgen
}
static void Test__ZN3ccc6EE1x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE1x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE1x15E, buf);
    ::ccc::EE1x15 *dp, &lv = *(dp=new (buf) ::ccc::EE1x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE1x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE1x15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc6EE1x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE1x15E);
    dp->::ccc::EE1x15::~EE1x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE1x15E(Test__ZN3ccc6EE1x15E, "_ZN3ccc6EE1x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE1x15C1Ev();
extern void _ZN3ccc6EE1x15D1Ev();
Name_Map name_map__ZN3ccc6EE1x15E[] = {
  NSPAIR(_ZN3ccc6EE1x15C1Ev),
  NSPAIR(_ZN3ccc6EE1x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
static Base_Class bases__ZN3ccc6EE1x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE1x15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE1x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE1x15E[] = {
  {&(_ZTVN3ccc6EE1x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE1x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
Class_Descriptor cd__ZN3ccc6EE1x15E = {  "_ZN3ccc6EE1x15E", // class name
  bases__ZN3ccc6EE1x15E, 1,
  &(vtc__ZN3ccc6EE1x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE1x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE1x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE1x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE1x15E),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
namespace ccc { 
struct  AA2  {
  virtual void  efg(); // _ZN3ccc3AA23efgEv
  virtual void  abc(); // _ZN3ccc3AA23abcEv
  virtual void  pqr(); // _ZN3ccc3AA23pqrEv
  ~AA2(); // tgen
  AA2(); // tgen
};
//SIG(-1 _ZN3ccc3AA2E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA2 ::efg(){vfunc_called(this, "_ZN3ccc3AA23efgEv");}
void  ccc::AA2 ::abc(){vfunc_called(this, "_ZN3ccc3AA23abcEv");}
void  ccc::AA2 ::pqr(){vfunc_called(this, "_ZN3ccc3AA23pqrEv");}
ccc::AA2 ::~AA2(){ note_dtor("_ZN3ccc3AA2E", this);} // tgen
ccc::AA2 ::AA2(){ note_ctor("_ZN3ccc3AA2E", this);} // tgen
}
static void Test__ZN3ccc3AA2E()
{
  extern Class_Descriptor cd__ZN3ccc3AA2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA2E, buf);
    ::ccc::AA2 *dp, &lv = *(dp=new (buf) ::ccc::AA2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA2E)");
    test_class_info(&lv, &cd__ZN3ccc3AA2E);
    dp->::ccc::AA2::~AA2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA2E(Test__ZN3ccc3AA2E, "_ZN3ccc3AA2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA2C1Ev();
extern void _ZN3ccc3AA2D1Ev();
Name_Map name_map__ZN3ccc3AA2E[] = {
  NSPAIR(_ZN3ccc3AA2C1Ev),
  NSPAIR(_ZN3ccc3AA2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA2E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
Class_Descriptor cd__ZN3ccc3AA2E = {  "_ZN3ccc3AA2E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA2E),5, //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
namespace ccc { 
struct  BB2  {
  virtual void  efg(); // _ZN3ccc3BB23efgEv
  virtual void  abc(); // _ZN3ccc3BB23abcEv
  virtual void  pqr(); // _ZN3ccc3BB23pqrEv
  ~BB2(); // tgen
  BB2(); // tgen
};
//SIG(1 _ZN3ccc3BB2E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB2 ::efg(){vfunc_called(this, "_ZN3ccc3BB23efgEv");}
void  ccc::BB2 ::abc(){vfunc_called(this, "_ZN3ccc3BB23abcEv");}
void  ccc::BB2 ::pqr(){vfunc_called(this, "_ZN3ccc3BB23pqrEv");}
ccc::BB2 ::~BB2(){ note_dtor("_ZN3ccc3BB2E", this);} // tgen
ccc::BB2 ::BB2(){ note_ctor("_ZN3ccc3BB2E", this);} // tgen
}
static void Test__ZN3ccc3BB2E()
{
  extern Class_Descriptor cd__ZN3ccc3BB2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB2E, buf);
    ::ccc::BB2 *dp, &lv = *(dp=new (buf) ::ccc::BB2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB2E)");
    test_class_info(&lv, &cd__ZN3ccc3BB2E);
    dp->::ccc::BB2::~BB2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB2E(Test__ZN3ccc3BB2E, "_ZN3ccc3BB2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB2C1Ev();
extern void _ZN3ccc3BB2D1Ev();
Name_Map name_map__ZN3ccc3BB2E[] = {
  NSPAIR(_ZN3ccc3BB2C1Ev),
  NSPAIR(_ZN3ccc3BB2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB2E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
Class_Descriptor cd__ZN3ccc3BB2E = {  "_ZN3ccc3BB2E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB2E),5, //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
namespace ccc { 
struct  EE2x0  : virtual ::ccc::AA2 {
  virtual void  abc(); // _ZN3ccc5EE2x03abcEv
  virtual void  efg(); // _ZN3ccc5EE2x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE2x03pqrEv
  ~EE2x0(); // tgen
  EE2x0(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x0E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x03abcEv");}
void  ccc::EE2x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x03efgEv");}
void  ccc::EE2x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x03pqrEv");}
ccc::EE2x0 ::~EE2x0(){ note_dtor("_ZN3ccc5EE2x0E", this);} // tgen
ccc::EE2x0 ::EE2x0(){ note_ctor("_ZN3ccc5EE2x0E", this);} // tgen
}
static void Test__ZN3ccc5EE2x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x0E, buf);
    ::ccc::EE2x0 *dp, &lv = *(dp=new (buf) ::ccc::EE2x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x0E);
    dp->::ccc::EE2x0::~EE2x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x0E(Test__ZN3ccc5EE2x0E, "_ZN3ccc5EE2x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x0C1Ev();
extern void _ZN3ccc5EE2x0D1Ev();
Name_Map name_map__ZN3ccc5EE2x0E[] = {
  NSPAIR(_ZN3ccc5EE2x0C1Ev),
  NSPAIR(_ZN3ccc5EE2x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x0E[];
extern void _ZN3ccc5EE2x03efgEv();
extern void _ZN3ccc5EE2x03abcEv();
extern void _ZN3ccc5EE2x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x0E[] = {
  {&(_ZTVN3ccc5EE2x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
Class_Descriptor cd__ZN3ccc5EE2x0E = {  "_ZN3ccc5EE2x0E", // class name
  bases__ZN3ccc5EE2x0E, 1,
  &(vtc__ZN3ccc5EE2x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x0E),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
namespace ccc { 
struct  EE2x1  : virtual ::ccc::AA2 {
  virtual void  abc(); // _ZN3ccc5EE2x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE2x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE2x13efgEv
  ~EE2x1(); // tgen
  EE2x1(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x1E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x13abcEv");}
void  ccc::EE2x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x13pqrEv");}
void  ccc::EE2x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x13efgEv");}
ccc::EE2x1 ::~EE2x1(){ note_dtor("_ZN3ccc5EE2x1E", this);} // tgen
ccc::EE2x1 ::EE2x1(){ note_ctor("_ZN3ccc5EE2x1E", this);} // tgen
}
static void Test__ZN3ccc5EE2x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x1E, buf);
    ::ccc::EE2x1 *dp, &lv = *(dp=new (buf) ::ccc::EE2x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x1E);
    dp->::ccc::EE2x1::~EE2x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x1E(Test__ZN3ccc5EE2x1E, "_ZN3ccc5EE2x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x1C1Ev();
extern void _ZN3ccc5EE2x1D1Ev();
Name_Map name_map__ZN3ccc5EE2x1E[] = {
  NSPAIR(_ZN3ccc5EE2x1C1Ev),
  NSPAIR(_ZN3ccc5EE2x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x1E[];
extern void _ZN3ccc5EE2x13efgEv();
extern void _ZN3ccc5EE2x13abcEv();
extern void _ZN3ccc5EE2x13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x1E[] = {
  {&(_ZTVN3ccc5EE2x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
Class_Descriptor cd__ZN3ccc5EE2x1E = {  "_ZN3ccc5EE2x1E", // class name
  bases__ZN3ccc5EE2x1E, 1,
  &(vtc__ZN3ccc5EE2x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x1E),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
namespace ccc { 
struct  EE2x2  : virtual ::ccc::AA2 {
  virtual void  efg(); // _ZN3ccc5EE2x23efgEv
  virtual void  abc(); // _ZN3ccc5EE2x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE2x23pqrEv
  ~EE2x2(); // tgen
  EE2x2(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x2E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x23efgEv");}
void  ccc::EE2x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x23abcEv");}
void  ccc::EE2x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x23pqrEv");}
ccc::EE2x2 ::~EE2x2(){ note_dtor("_ZN3ccc5EE2x2E", this);} // tgen
ccc::EE2x2 ::EE2x2(){ note_ctor("_ZN3ccc5EE2x2E", this);} // tgen
}
static void Test__ZN3ccc5EE2x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x2E, buf);
    ::ccc::EE2x2 *dp, &lv = *(dp=new (buf) ::ccc::EE2x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x2E);
    dp->::ccc::EE2x2::~EE2x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x2E(Test__ZN3ccc5EE2x2E, "_ZN3ccc5EE2x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x2C1Ev();
extern void _ZN3ccc5EE2x2D1Ev();
Name_Map name_map__ZN3ccc5EE2x2E[] = {
  NSPAIR(_ZN3ccc5EE2x2C1Ev),
  NSPAIR(_ZN3ccc5EE2x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x2E[];
extern void _ZN3ccc5EE2x23efgEv();
extern void _ZN3ccc5EE2x23abcEv();
extern void _ZN3ccc5EE2x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x2E[] = {
  {&(_ZTVN3ccc5EE2x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
Class_Descriptor cd__ZN3ccc5EE2x2E = {  "_ZN3ccc5EE2x2E", // class name
  bases__ZN3ccc5EE2x2E, 1,
  &(vtc__ZN3ccc5EE2x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x2E),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
namespace ccc { 
struct  EE2x3  : virtual ::ccc::AA2 {
  virtual void  efg(); // _ZN3ccc5EE2x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE2x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE2x33abcEv
  ~EE2x3(); // tgen
  EE2x3(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x3E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x33efgEv");}
void  ccc::EE2x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x33pqrEv");}
void  ccc::EE2x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x33abcEv");}
ccc::EE2x3 ::~EE2x3(){ note_dtor("_ZN3ccc5EE2x3E", this);} // tgen
ccc::EE2x3 ::EE2x3(){ note_ctor("_ZN3ccc5EE2x3E", this);} // tgen
}
static void Test__ZN3ccc5EE2x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x3E, buf);
    ::ccc::EE2x3 *dp, &lv = *(dp=new (buf) ::ccc::EE2x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x3E);
    dp->::ccc::EE2x3::~EE2x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x3E(Test__ZN3ccc5EE2x3E, "_ZN3ccc5EE2x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x3C1Ev();
extern void _ZN3ccc5EE2x3D1Ev();
Name_Map name_map__ZN3ccc5EE2x3E[] = {
  NSPAIR(_ZN3ccc5EE2x3C1Ev),
  NSPAIR(_ZN3ccc5EE2x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x3E[];
extern void _ZN3ccc5EE2x33efgEv();
extern void _ZN3ccc5EE2x33abcEv();
extern void _ZN3ccc5EE2x33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x3E[] = {
  {&(_ZTVN3ccc5EE2x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
Class_Descriptor cd__ZN3ccc5EE2x3E = {  "_ZN3ccc5EE2x3E", // class name
  bases__ZN3ccc5EE2x3E, 1,
  &(vtc__ZN3ccc5EE2x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x3E),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
namespace ccc { 
struct  EE2x4  : virtual ::ccc::AA2 {
  virtual void  pqr(); // _ZN3ccc5EE2x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE2x43abcEv
  virtual void  efg(); // _ZN3ccc5EE2x43efgEv
  ~EE2x4(); // tgen
  EE2x4(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x4E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x43pqrEv");}
void  ccc::EE2x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x43abcEv");}
void  ccc::EE2x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x43efgEv");}
ccc::EE2x4 ::~EE2x4(){ note_dtor("_ZN3ccc5EE2x4E", this);} // tgen
ccc::EE2x4 ::EE2x4(){ note_ctor("_ZN3ccc5EE2x4E", this);} // tgen
}
static void Test__ZN3ccc5EE2x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x4E, buf);
    ::ccc::EE2x4 *dp, &lv = *(dp=new (buf) ::ccc::EE2x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x4E);
    dp->::ccc::EE2x4::~EE2x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x4E(Test__ZN3ccc5EE2x4E, "_ZN3ccc5EE2x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x4C1Ev();
extern void _ZN3ccc5EE2x4D1Ev();
Name_Map name_map__ZN3ccc5EE2x4E[] = {
  NSPAIR(_ZN3ccc5EE2x4C1Ev),
  NSPAIR(_ZN3ccc5EE2x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x4E[];
extern void _ZN3ccc5EE2x43efgEv();
extern void _ZN3ccc5EE2x43abcEv();
extern void _ZN3ccc5EE2x43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x4E[] = {
  {&(_ZTVN3ccc5EE2x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
Class_Descriptor cd__ZN3ccc5EE2x4E = {  "_ZN3ccc5EE2x4E", // class name
  bases__ZN3ccc5EE2x4E, 1,
  &(vtc__ZN3ccc5EE2x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x4E),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
namespace ccc { 
struct  EE2x5  : virtual ::ccc::AA2 {
  virtual void  pqr(); // _ZN3ccc5EE2x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE2x53efgEv
  virtual void  abc(); // _ZN3ccc5EE2x53abcEv
  ~EE2x5(); // tgen
  EE2x5(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x5E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE2x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x53pqrEv");}
void  ccc::EE2x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x53efgEv");}
void  ccc::EE2x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x53abcEv");}
ccc::EE2x5 ::~EE2x5(){ note_dtor("_ZN3ccc5EE2x5E", this);} // tgen
ccc::EE2x5 ::EE2x5(){ note_ctor("_ZN3ccc5EE2x5E", this);} // tgen
}
static void Test__ZN3ccc5EE2x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x5E, buf);
    ::ccc::EE2x5 *dp, &lv = *(dp=new (buf) ::ccc::EE2x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x5E);
    dp->::ccc::EE2x5::~EE2x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x5E(Test__ZN3ccc5EE2x5E, "_ZN3ccc5EE2x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x5C1Ev();
extern void _ZN3ccc5EE2x5D1Ev();
Name_Map name_map__ZN3ccc5EE2x5E[] = {
  NSPAIR(_ZN3ccc5EE2x5C1Ev),
  NSPAIR(_ZN3ccc5EE2x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x5E[];
extern void _ZN3ccc5EE2x53efgEv();
extern void _ZN3ccc5EE2x53abcEv();
extern void _ZN3ccc5EE2x53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x5E[] = {
  {&(_ZTVN3ccc5EE2x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
Class_Descriptor cd__ZN3ccc5EE2x5E = {  "_ZN3ccc5EE2x5E", // class name
  bases__ZN3ccc5EE2x5E, 1,
  &(vtc__ZN3ccc5EE2x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x5E),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
namespace ccc { 
struct  EE2x6  : virtual ::ccc::AA2 {
  virtual void  abc(); // _ZN3ccc5EE2x63abcEv
  virtual void  efg(); // _ZN3ccc5EE2x63efgEv
  ~EE2x6(); // tgen
  EE2x6(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x6E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE2x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x63abcEv");}
void  ccc::EE2x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x63efgEv");}
ccc::EE2x6 ::~EE2x6(){ note_dtor("_ZN3ccc5EE2x6E", this);} // tgen
ccc::EE2x6 ::EE2x6(){ note_ctor("_ZN3ccc5EE2x6E", this);} // tgen
}
static void Test__ZN3ccc5EE2x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x6E, buf);
    ::ccc::EE2x6 *dp, &lv = *(dp=new (buf) ::ccc::EE2x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x6E);
    dp->::ccc::EE2x6::~EE2x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x6E(Test__ZN3ccc5EE2x6E, "_ZN3ccc5EE2x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x6C1Ev();
extern void _ZN3ccc5EE2x6D1Ev();
Name_Map name_map__ZN3ccc5EE2x6E[] = {
  NSPAIR(_ZN3ccc5EE2x6C1Ev),
  NSPAIR(_ZN3ccc5EE2x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x6E[];
extern void _ZN3ccc5EE2x63efgEv();
extern void _ZN3ccc5EE2x63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x6E[] = {
  {&(_ZTVN3ccc5EE2x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
Class_Descriptor cd__ZN3ccc5EE2x6E = {  "_ZN3ccc5EE2x6E", // class name
  bases__ZN3ccc5EE2x6E, 1,
  &(vtc__ZN3ccc5EE2x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x6E),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
namespace ccc { 
struct  EE2x7  : virtual ::ccc::AA2 {
  virtual void  abc(); // _ZN3ccc5EE2x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE2x73pqrEv
  ~EE2x7(); // tgen
  EE2x7(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x7E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE2x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x73abcEv");}
void  ccc::EE2x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x73pqrEv");}
ccc::EE2x7 ::~EE2x7(){ note_dtor("_ZN3ccc5EE2x7E", this);} // tgen
ccc::EE2x7 ::EE2x7(){ note_ctor("_ZN3ccc5EE2x7E", this);} // tgen
}
static void Test__ZN3ccc5EE2x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x7E, buf);
    ::ccc::EE2x7 *dp, &lv = *(dp=new (buf) ::ccc::EE2x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x7E);
    dp->::ccc::EE2x7::~EE2x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x7E(Test__ZN3ccc5EE2x7E, "_ZN3ccc5EE2x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x7C1Ev();
extern void _ZN3ccc5EE2x7D1Ev();
Name_Map name_map__ZN3ccc5EE2x7E[] = {
  NSPAIR(_ZN3ccc5EE2x7C1Ev),
  NSPAIR(_ZN3ccc5EE2x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc5EE2x73abcEv();
extern void _ZN3ccc5EE2x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x7E[] = {
  {&(_ZTVN3ccc5EE2x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
Class_Descriptor cd__ZN3ccc5EE2x7E = {  "_ZN3ccc5EE2x7E", // class name
  bases__ZN3ccc5EE2x7E, 1,
  &(vtc__ZN3ccc5EE2x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x7E),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
namespace ccc { 
struct  EE2x8  : virtual ::ccc::AA2 {
  virtual void  efg(); // _ZN3ccc5EE2x83efgEv
  virtual void  abc(); // _ZN3ccc5EE2x83abcEv
  ~EE2x8(); // tgen
  EE2x8(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x8E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE2x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x83efgEv");}
void  ccc::EE2x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE2x83abcEv");}
ccc::EE2x8 ::~EE2x8(){ note_dtor("_ZN3ccc5EE2x8E", this);} // tgen
ccc::EE2x8 ::EE2x8(){ note_ctor("_ZN3ccc5EE2x8E", this);} // tgen
}
static void Test__ZN3ccc5EE2x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x8E, buf);
    ::ccc::EE2x8 *dp, &lv = *(dp=new (buf) ::ccc::EE2x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x8E);
    dp->::ccc::EE2x8::~EE2x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x8E(Test__ZN3ccc5EE2x8E, "_ZN3ccc5EE2x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x8C1Ev();
extern void _ZN3ccc5EE2x8D1Ev();
Name_Map name_map__ZN3ccc5EE2x8E[] = {
  NSPAIR(_ZN3ccc5EE2x8C1Ev),
  NSPAIR(_ZN3ccc5EE2x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x8E[];
extern void _ZN3ccc5EE2x83efgEv();
extern void _ZN3ccc5EE2x83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x8E[] = {
  {&(_ZTVN3ccc5EE2x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
Class_Descriptor cd__ZN3ccc5EE2x8E = {  "_ZN3ccc5EE2x8E", // class name
  bases__ZN3ccc5EE2x8E, 1,
  &(vtc__ZN3ccc5EE2x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x8E),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
namespace ccc { 
struct  EE2x9  : virtual ::ccc::AA2 {
  virtual void  efg(); // _ZN3ccc5EE2x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE2x93pqrEv
  ~EE2x9(); // tgen
  EE2x9(); // tgen
};
//SIG(-1 _ZN3ccc5EE2x9E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE2x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE2x93efgEv");}
void  ccc::EE2x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE2x93pqrEv");}
ccc::EE2x9 ::~EE2x9(){ note_dtor("_ZN3ccc5EE2x9E", this);} // tgen
ccc::EE2x9 ::EE2x9(){ note_ctor("_ZN3ccc5EE2x9E", this);} // tgen
}
static void Test__ZN3ccc5EE2x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE2x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE2x9E, buf);
    ::ccc::EE2x9 *dp, &lv = *(dp=new (buf) ::ccc::EE2x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE2x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE2x9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc5EE2x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE2x9E);
    dp->::ccc::EE2x9::~EE2x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE2x9E(Test__ZN3ccc5EE2x9E, "_ZN3ccc5EE2x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE2x9C1Ev();
extern void _ZN3ccc5EE2x9D1Ev();
Name_Map name_map__ZN3ccc5EE2x9E[] = {
  NSPAIR(_ZN3ccc5EE2x9C1Ev),
  NSPAIR(_ZN3ccc5EE2x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc5EE2x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE2x9E[];
extern void _ZN3ccc5EE2x93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc5EE2x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE2x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE2x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE2x9E[] = {
  {&(_ZTVN3ccc5EE2x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE2x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
Class_Descriptor cd__ZN3ccc5EE2x9E = {  "_ZN3ccc5EE2x9E", // class name
  bases__ZN3ccc5EE2x9E, 1,
  &(vtc__ZN3ccc5EE2x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE2x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE2x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE2x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE2x9E),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
namespace ccc { 
struct  EE2x10  : virtual ::ccc::AA2 {
  virtual void  pqr(); // _ZN3ccc6EE2x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE2x103abcEv
  ~EE2x10(); // tgen
  EE2x10(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x10E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE2x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE2x103pqrEv");}
void  ccc::EE2x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE2x103abcEv");}
ccc::EE2x10 ::~EE2x10(){ note_dtor("_ZN3ccc6EE2x10E", this);} // tgen
ccc::EE2x10 ::EE2x10(){ note_ctor("_ZN3ccc6EE2x10E", this);} // tgen
}
static void Test__ZN3ccc6EE2x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x10E, buf);
    ::ccc::EE2x10 *dp, &lv = *(dp=new (buf) ::ccc::EE2x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x10E);
    dp->::ccc::EE2x10::~EE2x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x10E(Test__ZN3ccc6EE2x10E, "_ZN3ccc6EE2x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x10C1Ev();
extern void _ZN3ccc6EE2x10D1Ev();
Name_Map name_map__ZN3ccc6EE2x10E[] = {
  NSPAIR(_ZN3ccc6EE2x10C1Ev),
  NSPAIR(_ZN3ccc6EE2x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc6EE2x103abcEv();
extern void _ZN3ccc6EE2x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE2x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x10E[] = {
  {&(_ZTVN3ccc6EE2x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
Class_Descriptor cd__ZN3ccc6EE2x10E = {  "_ZN3ccc6EE2x10E", // class name
  bases__ZN3ccc6EE2x10E, 1,
  &(vtc__ZN3ccc6EE2x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x10E),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
namespace ccc { 
struct  EE2x11  : virtual ::ccc::AA2 {
  virtual void  pqr(); // _ZN3ccc6EE2x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE2x113efgEv
  ~EE2x11(); // tgen
  EE2x11(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x11E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE2x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE2x113pqrEv");}
void  ccc::EE2x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE2x113efgEv");}
ccc::EE2x11 ::~EE2x11(){ note_dtor("_ZN3ccc6EE2x11E", this);} // tgen
ccc::EE2x11 ::EE2x11(){ note_ctor("_ZN3ccc6EE2x11E", this);} // tgen
}
static void Test__ZN3ccc6EE2x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x11E, buf);
    ::ccc::EE2x11 *dp, &lv = *(dp=new (buf) ::ccc::EE2x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x11E);
    dp->::ccc::EE2x11::~EE2x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x11E(Test__ZN3ccc6EE2x11E, "_ZN3ccc6EE2x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x11C1Ev();
extern void _ZN3ccc6EE2x11D1Ev();
Name_Map name_map__ZN3ccc6EE2x11E[] = {
  NSPAIR(_ZN3ccc6EE2x11C1Ev),
  NSPAIR(_ZN3ccc6EE2x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x11E[];
extern void _ZN3ccc6EE2x113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc6EE2x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE2x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x11E[] = {
  {&(_ZTVN3ccc6EE2x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
Class_Descriptor cd__ZN3ccc6EE2x11E = {  "_ZN3ccc6EE2x11E", // class name
  bases__ZN3ccc6EE2x11E, 1,
  &(vtc__ZN3ccc6EE2x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x11E),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
namespace ccc { 
struct  EE2x12  : virtual ::ccc::AA2 {
  virtual void  abc(); // _ZN3ccc6EE2x123abcEv
  ~EE2x12(); // tgen
  EE2x12(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x12E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE2x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE2x123abcEv");}
ccc::EE2x12 ::~EE2x12(){ note_dtor("_ZN3ccc6EE2x12E", this);} // tgen
ccc::EE2x12 ::EE2x12(){ note_ctor("_ZN3ccc6EE2x12E", this);} // tgen
}
static void Test__ZN3ccc6EE2x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x12E, buf);
    ::ccc::EE2x12 *dp, &lv = *(dp=new (buf) ::ccc::EE2x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x12E);
    dp->::ccc::EE2x12::~EE2x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x12E(Test__ZN3ccc6EE2x12E, "_ZN3ccc6EE2x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x12C1Ev();
extern void _ZN3ccc6EE2x12D1Ev();
Name_Map name_map__ZN3ccc6EE2x12E[] = {
  NSPAIR(_ZN3ccc6EE2x12C1Ev),
  NSPAIR(_ZN3ccc6EE2x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc6EE2x123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x12E[] = {
  {&(_ZTVN3ccc6EE2x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
Class_Descriptor cd__ZN3ccc6EE2x12E = {  "_ZN3ccc6EE2x12E", // class name
  bases__ZN3ccc6EE2x12E, 1,
  &(vtc__ZN3ccc6EE2x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x12E),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
namespace ccc { 
struct  EE2x13  : virtual ::ccc::AA2 {
  virtual void  efg(); // _ZN3ccc6EE2x133efgEv
  ~EE2x13(); // tgen
  EE2x13(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x13E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE2x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE2x133efgEv");}
ccc::EE2x13 ::~EE2x13(){ note_dtor("_ZN3ccc6EE2x13E", this);} // tgen
ccc::EE2x13 ::EE2x13(){ note_ctor("_ZN3ccc6EE2x13E", this);} // tgen
}
static void Test__ZN3ccc6EE2x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x13E, buf);
    ::ccc::EE2x13 *dp, &lv = *(dp=new (buf) ::ccc::EE2x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x13E);
    dp->::ccc::EE2x13::~EE2x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x13E(Test__ZN3ccc6EE2x13E, "_ZN3ccc6EE2x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x13C1Ev();
extern void _ZN3ccc6EE2x13D1Ev();
Name_Map name_map__ZN3ccc6EE2x13E[] = {
  NSPAIR(_ZN3ccc6EE2x13C1Ev),
  NSPAIR(_ZN3ccc6EE2x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x13E[];
extern void _ZN3ccc6EE2x133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x13E[] = {
  {&(_ZTVN3ccc6EE2x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
Class_Descriptor cd__ZN3ccc6EE2x13E = {  "_ZN3ccc6EE2x13E", // class name
  bases__ZN3ccc6EE2x13E, 1,
  &(vtc__ZN3ccc6EE2x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x13E),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
namespace ccc { 
struct  EE2x14  : virtual ::ccc::AA2 {
  virtual void  pqr(); // _ZN3ccc6EE2x143pqrEv
  ~EE2x14(); // tgen
  EE2x14(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x14E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE2x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE2x143pqrEv");}
ccc::EE2x14 ::~EE2x14(){ note_dtor("_ZN3ccc6EE2x14E", this);} // tgen
ccc::EE2x14 ::EE2x14(){ note_ctor("_ZN3ccc6EE2x14E", this);} // tgen
}
static void Test__ZN3ccc6EE2x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x14E, buf);
    ::ccc::EE2x14 *dp, &lv = *(dp=new (buf) ::ccc::EE2x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x14E);
    dp->::ccc::EE2x14::~EE2x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x14E(Test__ZN3ccc6EE2x14E, "_ZN3ccc6EE2x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x14C1Ev();
extern void _ZN3ccc6EE2x14D1Ev();
Name_Map name_map__ZN3ccc6EE2x14E[] = {
  NSPAIR(_ZN3ccc6EE2x14C1Ev),
  NSPAIR(_ZN3ccc6EE2x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc6EE2x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE2x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x14E[] = {
  {&(_ZTVN3ccc6EE2x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
Class_Descriptor cd__ZN3ccc6EE2x14E = {  "_ZN3ccc6EE2x14E", // class name
  bases__ZN3ccc6EE2x14E, 1,
  &(vtc__ZN3ccc6EE2x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x14E),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
namespace ccc { 
struct  EE2x15  : virtual ::ccc::AA2 {
  ~EE2x15(); // tgen
  EE2x15(); // tgen
};
//SIG(-1 _ZN3ccc6EE2x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE2x15 ::~EE2x15(){ note_dtor("_ZN3ccc6EE2x15E", this);} // tgen
ccc::EE2x15 ::EE2x15(){ note_ctor("_ZN3ccc6EE2x15E", this);} // tgen
}
static void Test__ZN3ccc6EE2x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE2x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE2x15E, buf);
    ::ccc::EE2x15 *dp, &lv = *(dp=new (buf) ::ccc::EE2x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE2x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE2x15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc6EE2x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE2x15E);
    dp->::ccc::EE2x15::~EE2x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE2x15E(Test__ZN3ccc6EE2x15E, "_ZN3ccc6EE2x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE2x15C1Ev();
extern void _ZN3ccc6EE2x15D1Ev();
Name_Map name_map__ZN3ccc6EE2x15E[] = {
  NSPAIR(_ZN3ccc6EE2x15C1Ev),
  NSPAIR(_ZN3ccc6EE2x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
static Base_Class bases__ZN3ccc6EE2x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE2x15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE2x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE2x15E[] = {
  {&(_ZTVN3ccc6EE2x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE2x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
Class_Descriptor cd__ZN3ccc6EE2x15E = {  "_ZN3ccc6EE2x15E", // class name
  bases__ZN3ccc6EE2x15E, 1,
  &(vtc__ZN3ccc6EE2x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE2x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE2x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE2x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE2x15E),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
namespace ccc { 
struct  AA3  {
  virtual void  efg(); // _ZN3ccc3AA33efgEv
  virtual void  pqr(); // _ZN3ccc3AA33pqrEv
  virtual void  abc(); // _ZN3ccc3AA33abcEv
  ~AA3(); // tgen
  AA3(); // tgen
};
//SIG(-1 _ZN3ccc3AA3E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA3 ::efg(){vfunc_called(this, "_ZN3ccc3AA33efgEv");}
void  ccc::AA3 ::pqr(){vfunc_called(this, "_ZN3ccc3AA33pqrEv");}
void  ccc::AA3 ::abc(){vfunc_called(this, "_ZN3ccc3AA33abcEv");}
ccc::AA3 ::~AA3(){ note_dtor("_ZN3ccc3AA3E", this);} // tgen
ccc::AA3 ::AA3(){ note_ctor("_ZN3ccc3AA3E", this);} // tgen
}
static void Test__ZN3ccc3AA3E()
{
  extern Class_Descriptor cd__ZN3ccc3AA3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA3E, buf);
    ::ccc::AA3 *dp, &lv = *(dp=new (buf) ::ccc::AA3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA3E)");
    test_class_info(&lv, &cd__ZN3ccc3AA3E);
    dp->::ccc::AA3::~AA3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA3E(Test__ZN3ccc3AA3E, "_ZN3ccc3AA3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA3C1Ev();
extern void _ZN3ccc3AA3D1Ev();
Name_Map name_map__ZN3ccc3AA3E[] = {
  NSPAIR(_ZN3ccc3AA3C1Ev),
  NSPAIR(_ZN3ccc3AA3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA3E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
Class_Descriptor cd__ZN3ccc3AA3E = {  "_ZN3ccc3AA3E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA3E),5, //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
namespace ccc { 
struct  BB3  {
  virtual void  efg(); // _ZN3ccc3BB33efgEv
  virtual void  pqr(); // _ZN3ccc3BB33pqrEv
  virtual void  abc(); // _ZN3ccc3BB33abcEv
  ~BB3(); // tgen
  BB3(); // tgen
};
//SIG(1 _ZN3ccc3BB3E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB3 ::efg(){vfunc_called(this, "_ZN3ccc3BB33efgEv");}
void  ccc::BB3 ::pqr(){vfunc_called(this, "_ZN3ccc3BB33pqrEv");}
void  ccc::BB3 ::abc(){vfunc_called(this, "_ZN3ccc3BB33abcEv");}
ccc::BB3 ::~BB3(){ note_dtor("_ZN3ccc3BB3E", this);} // tgen
ccc::BB3 ::BB3(){ note_ctor("_ZN3ccc3BB3E", this);} // tgen
}
static void Test__ZN3ccc3BB3E()
{
  extern Class_Descriptor cd__ZN3ccc3BB3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB3E, buf);
    ::ccc::BB3 *dp, &lv = *(dp=new (buf) ::ccc::BB3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB3E)");
    test_class_info(&lv, &cd__ZN3ccc3BB3E);
    dp->::ccc::BB3::~BB3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB3E(Test__ZN3ccc3BB3E, "_ZN3ccc3BB3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB3C1Ev();
extern void _ZN3ccc3BB3D1Ev();
Name_Map name_map__ZN3ccc3BB3E[] = {
  NSPAIR(_ZN3ccc3BB3C1Ev),
  NSPAIR(_ZN3ccc3BB3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB3E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
Class_Descriptor cd__ZN3ccc3BB3E = {  "_ZN3ccc3BB3E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB3E),5, //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
namespace ccc { 
struct  EE3x0  : virtual ::ccc::AA3 {
  virtual void  abc(); // _ZN3ccc5EE3x03abcEv
  virtual void  efg(); // _ZN3ccc5EE3x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE3x03pqrEv
  ~EE3x0(); // tgen
  EE3x0(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x0E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x03abcEv");}
void  ccc::EE3x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x03efgEv");}
void  ccc::EE3x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x03pqrEv");}
ccc::EE3x0 ::~EE3x0(){ note_dtor("_ZN3ccc5EE3x0E", this);} // tgen
ccc::EE3x0 ::EE3x0(){ note_ctor("_ZN3ccc5EE3x0E", this);} // tgen
}
static void Test__ZN3ccc5EE3x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x0E, buf);
    ::ccc::EE3x0 *dp, &lv = *(dp=new (buf) ::ccc::EE3x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x0E);
    dp->::ccc::EE3x0::~EE3x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x0E(Test__ZN3ccc5EE3x0E, "_ZN3ccc5EE3x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x0C1Ev();
extern void _ZN3ccc5EE3x0D1Ev();
Name_Map name_map__ZN3ccc5EE3x0E[] = {
  NSPAIR(_ZN3ccc5EE3x0C1Ev),
  NSPAIR(_ZN3ccc5EE3x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x0E[];
extern void _ZN3ccc5EE3x03efgEv();
extern void _ZN3ccc5EE3x03pqrEv();
extern void _ZN3ccc5EE3x03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x0E[] = {
  {&(_ZTVN3ccc5EE3x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
Class_Descriptor cd__ZN3ccc5EE3x0E = {  "_ZN3ccc5EE3x0E", // class name
  bases__ZN3ccc5EE3x0E, 1,
  &(vtc__ZN3ccc5EE3x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x0E),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
namespace ccc { 
struct  EE3x1  : virtual ::ccc::AA3 {
  virtual void  abc(); // _ZN3ccc5EE3x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE3x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE3x13efgEv
  ~EE3x1(); // tgen
  EE3x1(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x1E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x13abcEv");}
void  ccc::EE3x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x13pqrEv");}
void  ccc::EE3x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x13efgEv");}
ccc::EE3x1 ::~EE3x1(){ note_dtor("_ZN3ccc5EE3x1E", this);} // tgen
ccc::EE3x1 ::EE3x1(){ note_ctor("_ZN3ccc5EE3x1E", this);} // tgen
}
static void Test__ZN3ccc5EE3x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x1E, buf);
    ::ccc::EE3x1 *dp, &lv = *(dp=new (buf) ::ccc::EE3x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x1E);
    dp->::ccc::EE3x1::~EE3x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x1E(Test__ZN3ccc5EE3x1E, "_ZN3ccc5EE3x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x1C1Ev();
extern void _ZN3ccc5EE3x1D1Ev();
Name_Map name_map__ZN3ccc5EE3x1E[] = {
  NSPAIR(_ZN3ccc5EE3x1C1Ev),
  NSPAIR(_ZN3ccc5EE3x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x1E[];
extern void _ZN3ccc5EE3x13efgEv();
extern void _ZN3ccc5EE3x13pqrEv();
extern void _ZN3ccc5EE3x13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x1E[] = {
  {&(_ZTVN3ccc5EE3x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
Class_Descriptor cd__ZN3ccc5EE3x1E = {  "_ZN3ccc5EE3x1E", // class name
  bases__ZN3ccc5EE3x1E, 1,
  &(vtc__ZN3ccc5EE3x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x1E),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
namespace ccc { 
struct  EE3x2  : virtual ::ccc::AA3 {
  virtual void  efg(); // _ZN3ccc5EE3x23efgEv
  virtual void  abc(); // _ZN3ccc5EE3x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE3x23pqrEv
  ~EE3x2(); // tgen
  EE3x2(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x2E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x23efgEv");}
void  ccc::EE3x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x23abcEv");}
void  ccc::EE3x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x23pqrEv");}
ccc::EE3x2 ::~EE3x2(){ note_dtor("_ZN3ccc5EE3x2E", this);} // tgen
ccc::EE3x2 ::EE3x2(){ note_ctor("_ZN3ccc5EE3x2E", this);} // tgen
}
static void Test__ZN3ccc5EE3x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x2E, buf);
    ::ccc::EE3x2 *dp, &lv = *(dp=new (buf) ::ccc::EE3x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x2E);
    dp->::ccc::EE3x2::~EE3x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x2E(Test__ZN3ccc5EE3x2E, "_ZN3ccc5EE3x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x2C1Ev();
extern void _ZN3ccc5EE3x2D1Ev();
Name_Map name_map__ZN3ccc5EE3x2E[] = {
  NSPAIR(_ZN3ccc5EE3x2C1Ev),
  NSPAIR(_ZN3ccc5EE3x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x2E[];
extern void _ZN3ccc5EE3x23efgEv();
extern void _ZN3ccc5EE3x23pqrEv();
extern void _ZN3ccc5EE3x23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x2E[] = {
  {&(_ZTVN3ccc5EE3x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
Class_Descriptor cd__ZN3ccc5EE3x2E = {  "_ZN3ccc5EE3x2E", // class name
  bases__ZN3ccc5EE3x2E, 1,
  &(vtc__ZN3ccc5EE3x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x2E),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
namespace ccc { 
struct  EE3x3  : virtual ::ccc::AA3 {
  virtual void  efg(); // _ZN3ccc5EE3x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE3x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE3x33abcEv
  ~EE3x3(); // tgen
  EE3x3(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x3E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x33efgEv");}
void  ccc::EE3x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x33pqrEv");}
void  ccc::EE3x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x33abcEv");}
ccc::EE3x3 ::~EE3x3(){ note_dtor("_ZN3ccc5EE3x3E", this);} // tgen
ccc::EE3x3 ::EE3x3(){ note_ctor("_ZN3ccc5EE3x3E", this);} // tgen
}
static void Test__ZN3ccc5EE3x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x3E, buf);
    ::ccc::EE3x3 *dp, &lv = *(dp=new (buf) ::ccc::EE3x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x3E);
    dp->::ccc::EE3x3::~EE3x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x3E(Test__ZN3ccc5EE3x3E, "_ZN3ccc5EE3x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x3C1Ev();
extern void _ZN3ccc5EE3x3D1Ev();
Name_Map name_map__ZN3ccc5EE3x3E[] = {
  NSPAIR(_ZN3ccc5EE3x3C1Ev),
  NSPAIR(_ZN3ccc5EE3x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x3E[];
extern void _ZN3ccc5EE3x33efgEv();
extern void _ZN3ccc5EE3x33pqrEv();
extern void _ZN3ccc5EE3x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x3E[] = {
  {&(_ZTVN3ccc5EE3x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
Class_Descriptor cd__ZN3ccc5EE3x3E = {  "_ZN3ccc5EE3x3E", // class name
  bases__ZN3ccc5EE3x3E, 1,
  &(vtc__ZN3ccc5EE3x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x3E),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
namespace ccc { 
struct  EE3x4  : virtual ::ccc::AA3 {
  virtual void  pqr(); // _ZN3ccc5EE3x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE3x43abcEv
  virtual void  efg(); // _ZN3ccc5EE3x43efgEv
  ~EE3x4(); // tgen
  EE3x4(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x4E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x43pqrEv");}
void  ccc::EE3x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x43abcEv");}
void  ccc::EE3x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x43efgEv");}
ccc::EE3x4 ::~EE3x4(){ note_dtor("_ZN3ccc5EE3x4E", this);} // tgen
ccc::EE3x4 ::EE3x4(){ note_ctor("_ZN3ccc5EE3x4E", this);} // tgen
}
static void Test__ZN3ccc5EE3x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x4E, buf);
    ::ccc::EE3x4 *dp, &lv = *(dp=new (buf) ::ccc::EE3x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x4E);
    dp->::ccc::EE3x4::~EE3x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x4E(Test__ZN3ccc5EE3x4E, "_ZN3ccc5EE3x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x4C1Ev();
extern void _ZN3ccc5EE3x4D1Ev();
Name_Map name_map__ZN3ccc5EE3x4E[] = {
  NSPAIR(_ZN3ccc5EE3x4C1Ev),
  NSPAIR(_ZN3ccc5EE3x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x4E[];
extern void _ZN3ccc5EE3x43efgEv();
extern void _ZN3ccc5EE3x43pqrEv();
extern void _ZN3ccc5EE3x43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x4E[] = {
  {&(_ZTVN3ccc5EE3x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
Class_Descriptor cd__ZN3ccc5EE3x4E = {  "_ZN3ccc5EE3x4E", // class name
  bases__ZN3ccc5EE3x4E, 1,
  &(vtc__ZN3ccc5EE3x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x4E),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
namespace ccc { 
struct  EE3x5  : virtual ::ccc::AA3 {
  virtual void  pqr(); // _ZN3ccc5EE3x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE3x53efgEv
  virtual void  abc(); // _ZN3ccc5EE3x53abcEv
  ~EE3x5(); // tgen
  EE3x5(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x5E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE3x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x53pqrEv");}
void  ccc::EE3x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x53efgEv");}
void  ccc::EE3x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x53abcEv");}
ccc::EE3x5 ::~EE3x5(){ note_dtor("_ZN3ccc5EE3x5E", this);} // tgen
ccc::EE3x5 ::EE3x5(){ note_ctor("_ZN3ccc5EE3x5E", this);} // tgen
}
static void Test__ZN3ccc5EE3x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x5E, buf);
    ::ccc::EE3x5 *dp, &lv = *(dp=new (buf) ::ccc::EE3x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x5E);
    dp->::ccc::EE3x5::~EE3x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x5E(Test__ZN3ccc5EE3x5E, "_ZN3ccc5EE3x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x5C1Ev();
extern void _ZN3ccc5EE3x5D1Ev();
Name_Map name_map__ZN3ccc5EE3x5E[] = {
  NSPAIR(_ZN3ccc5EE3x5C1Ev),
  NSPAIR(_ZN3ccc5EE3x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x5E[];
extern void _ZN3ccc5EE3x53efgEv();
extern void _ZN3ccc5EE3x53pqrEv();
extern void _ZN3ccc5EE3x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x5E[] = {
  {&(_ZTVN3ccc5EE3x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
Class_Descriptor cd__ZN3ccc5EE3x5E = {  "_ZN3ccc5EE3x5E", // class name
  bases__ZN3ccc5EE3x5E, 1,
  &(vtc__ZN3ccc5EE3x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x5E),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
namespace ccc { 
struct  EE3x6  : virtual ::ccc::AA3 {
  virtual void  abc(); // _ZN3ccc5EE3x63abcEv
  virtual void  efg(); // _ZN3ccc5EE3x63efgEv
  ~EE3x6(); // tgen
  EE3x6(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x6E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE3x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x63abcEv");}
void  ccc::EE3x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x63efgEv");}
ccc::EE3x6 ::~EE3x6(){ note_dtor("_ZN3ccc5EE3x6E", this);} // tgen
ccc::EE3x6 ::EE3x6(){ note_ctor("_ZN3ccc5EE3x6E", this);} // tgen
}
static void Test__ZN3ccc5EE3x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x6E, buf);
    ::ccc::EE3x6 *dp, &lv = *(dp=new (buf) ::ccc::EE3x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x6E);
    dp->::ccc::EE3x6::~EE3x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x6E(Test__ZN3ccc5EE3x6E, "_ZN3ccc5EE3x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x6C1Ev();
extern void _ZN3ccc5EE3x6D1Ev();
Name_Map name_map__ZN3ccc5EE3x6E[] = {
  NSPAIR(_ZN3ccc5EE3x6C1Ev),
  NSPAIR(_ZN3ccc5EE3x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x6E[];
extern void _ZN3ccc5EE3x63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc5EE3x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x6E[] = {
  {&(_ZTVN3ccc5EE3x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
Class_Descriptor cd__ZN3ccc5EE3x6E = {  "_ZN3ccc5EE3x6E", // class name
  bases__ZN3ccc5EE3x6E, 1,
  &(vtc__ZN3ccc5EE3x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x6E),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
namespace ccc { 
struct  EE3x7  : virtual ::ccc::AA3 {
  virtual void  abc(); // _ZN3ccc5EE3x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE3x73pqrEv
  ~EE3x7(); // tgen
  EE3x7(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x7E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE3x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x73abcEv");}
void  ccc::EE3x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x73pqrEv");}
ccc::EE3x7 ::~EE3x7(){ note_dtor("_ZN3ccc5EE3x7E", this);} // tgen
ccc::EE3x7 ::EE3x7(){ note_ctor("_ZN3ccc5EE3x7E", this);} // tgen
}
static void Test__ZN3ccc5EE3x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x7E, buf);
    ::ccc::EE3x7 *dp, &lv = *(dp=new (buf) ::ccc::EE3x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x7E);
    dp->::ccc::EE3x7::~EE3x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x7E(Test__ZN3ccc5EE3x7E, "_ZN3ccc5EE3x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x7C1Ev();
extern void _ZN3ccc5EE3x7D1Ev();
Name_Map name_map__ZN3ccc5EE3x7E[] = {
  NSPAIR(_ZN3ccc5EE3x7C1Ev),
  NSPAIR(_ZN3ccc5EE3x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc5EE3x73pqrEv();
extern void _ZN3ccc5EE3x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x7E[] = {
  {&(_ZTVN3ccc5EE3x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
Class_Descriptor cd__ZN3ccc5EE3x7E = {  "_ZN3ccc5EE3x7E", // class name
  bases__ZN3ccc5EE3x7E, 1,
  &(vtc__ZN3ccc5EE3x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x7E),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
namespace ccc { 
struct  EE3x8  : virtual ::ccc::AA3 {
  virtual void  efg(); // _ZN3ccc5EE3x83efgEv
  virtual void  abc(); // _ZN3ccc5EE3x83abcEv
  ~EE3x8(); // tgen
  EE3x8(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x8E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE3x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x83efgEv");}
void  ccc::EE3x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE3x83abcEv");}
ccc::EE3x8 ::~EE3x8(){ note_dtor("_ZN3ccc5EE3x8E", this);} // tgen
ccc::EE3x8 ::EE3x8(){ note_ctor("_ZN3ccc5EE3x8E", this);} // tgen
}
static void Test__ZN3ccc5EE3x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x8E, buf);
    ::ccc::EE3x8 *dp, &lv = *(dp=new (buf) ::ccc::EE3x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x8E);
    dp->::ccc::EE3x8::~EE3x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x8E(Test__ZN3ccc5EE3x8E, "_ZN3ccc5EE3x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x8C1Ev();
extern void _ZN3ccc5EE3x8D1Ev();
Name_Map name_map__ZN3ccc5EE3x8E[] = {
  NSPAIR(_ZN3ccc5EE3x8C1Ev),
  NSPAIR(_ZN3ccc5EE3x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x8E[];
extern void _ZN3ccc5EE3x83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc5EE3x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x8E[] = {
  {&(_ZTVN3ccc5EE3x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
Class_Descriptor cd__ZN3ccc5EE3x8E = {  "_ZN3ccc5EE3x8E", // class name
  bases__ZN3ccc5EE3x8E, 1,
  &(vtc__ZN3ccc5EE3x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x8E),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
namespace ccc { 
struct  EE3x9  : virtual ::ccc::AA3 {
  virtual void  efg(); // _ZN3ccc5EE3x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE3x93pqrEv
  ~EE3x9(); // tgen
  EE3x9(); // tgen
};
//SIG(-1 _ZN3ccc5EE3x9E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE3x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE3x93efgEv");}
void  ccc::EE3x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE3x93pqrEv");}
ccc::EE3x9 ::~EE3x9(){ note_dtor("_ZN3ccc5EE3x9E", this);} // tgen
ccc::EE3x9 ::EE3x9(){ note_ctor("_ZN3ccc5EE3x9E", this);} // tgen
}
static void Test__ZN3ccc5EE3x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE3x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE3x9E, buf);
    ::ccc::EE3x9 *dp, &lv = *(dp=new (buf) ::ccc::EE3x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE3x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE3x9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc5EE3x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE3x9E);
    dp->::ccc::EE3x9::~EE3x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE3x9E(Test__ZN3ccc5EE3x9E, "_ZN3ccc5EE3x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE3x9C1Ev();
extern void _ZN3ccc5EE3x9D1Ev();
Name_Map name_map__ZN3ccc5EE3x9E[] = {
  NSPAIR(_ZN3ccc5EE3x9C1Ev),
  NSPAIR(_ZN3ccc5EE3x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc5EE3x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE3x9E[];
extern void _ZN3ccc5EE3x93efgEv();
extern void _ZN3ccc5EE3x93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE3x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE3x9E[] = {
  {&(_ZTVN3ccc5EE3x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE3x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
Class_Descriptor cd__ZN3ccc5EE3x9E = {  "_ZN3ccc5EE3x9E", // class name
  bases__ZN3ccc5EE3x9E, 1,
  &(vtc__ZN3ccc5EE3x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE3x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE3x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE3x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE3x9E),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
namespace ccc { 
struct  EE3x10  : virtual ::ccc::AA3 {
  virtual void  pqr(); // _ZN3ccc6EE3x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE3x103abcEv
  ~EE3x10(); // tgen
  EE3x10(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x10E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE3x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE3x103pqrEv");}
void  ccc::EE3x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE3x103abcEv");}
ccc::EE3x10 ::~EE3x10(){ note_dtor("_ZN3ccc6EE3x10E", this);} // tgen
ccc::EE3x10 ::EE3x10(){ note_ctor("_ZN3ccc6EE3x10E", this);} // tgen
}
static void Test__ZN3ccc6EE3x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x10E, buf);
    ::ccc::EE3x10 *dp, &lv = *(dp=new (buf) ::ccc::EE3x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x10E);
    dp->::ccc::EE3x10::~EE3x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x10E(Test__ZN3ccc6EE3x10E, "_ZN3ccc6EE3x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x10C1Ev();
extern void _ZN3ccc6EE3x10D1Ev();
Name_Map name_map__ZN3ccc6EE3x10E[] = {
  NSPAIR(_ZN3ccc6EE3x10C1Ev),
  NSPAIR(_ZN3ccc6EE3x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc6EE3x103pqrEv();
extern void _ZN3ccc6EE3x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE3x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x10E[] = {
  {&(_ZTVN3ccc6EE3x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
Class_Descriptor cd__ZN3ccc6EE3x10E = {  "_ZN3ccc6EE3x10E", // class name
  bases__ZN3ccc6EE3x10E, 1,
  &(vtc__ZN3ccc6EE3x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x10E),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
namespace ccc { 
struct  EE3x11  : virtual ::ccc::AA3 {
  virtual void  pqr(); // _ZN3ccc6EE3x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE3x113efgEv
  ~EE3x11(); // tgen
  EE3x11(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x11E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE3x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE3x113pqrEv");}
void  ccc::EE3x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE3x113efgEv");}
ccc::EE3x11 ::~EE3x11(){ note_dtor("_ZN3ccc6EE3x11E", this);} // tgen
ccc::EE3x11 ::EE3x11(){ note_ctor("_ZN3ccc6EE3x11E", this);} // tgen
}
static void Test__ZN3ccc6EE3x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x11E, buf);
    ::ccc::EE3x11 *dp, &lv = *(dp=new (buf) ::ccc::EE3x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x11E);
    dp->::ccc::EE3x11::~EE3x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x11E(Test__ZN3ccc6EE3x11E, "_ZN3ccc6EE3x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x11C1Ev();
extern void _ZN3ccc6EE3x11D1Ev();
Name_Map name_map__ZN3ccc6EE3x11E[] = {
  NSPAIR(_ZN3ccc6EE3x11C1Ev),
  NSPAIR(_ZN3ccc6EE3x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x11E[];
extern void _ZN3ccc6EE3x113efgEv();
extern void _ZN3ccc6EE3x113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x11E[] = {
  {&(_ZTVN3ccc6EE3x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
Class_Descriptor cd__ZN3ccc6EE3x11E = {  "_ZN3ccc6EE3x11E", // class name
  bases__ZN3ccc6EE3x11E, 1,
  &(vtc__ZN3ccc6EE3x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x11E),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
namespace ccc { 
struct  EE3x12  : virtual ::ccc::AA3 {
  virtual void  abc(); // _ZN3ccc6EE3x123abcEv
  ~EE3x12(); // tgen
  EE3x12(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x12E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE3x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE3x123abcEv");}
ccc::EE3x12 ::~EE3x12(){ note_dtor("_ZN3ccc6EE3x12E", this);} // tgen
ccc::EE3x12 ::EE3x12(){ note_ctor("_ZN3ccc6EE3x12E", this);} // tgen
}
static void Test__ZN3ccc6EE3x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x12E, buf);
    ::ccc::EE3x12 *dp, &lv = *(dp=new (buf) ::ccc::EE3x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x12E);
    dp->::ccc::EE3x12::~EE3x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x12E(Test__ZN3ccc6EE3x12E, "_ZN3ccc6EE3x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x12C1Ev();
extern void _ZN3ccc6EE3x12D1Ev();
Name_Map name_map__ZN3ccc6EE3x12E[] = {
  NSPAIR(_ZN3ccc6EE3x12C1Ev),
  NSPAIR(_ZN3ccc6EE3x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc6EE3x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE3x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x12E[] = {
  {&(_ZTVN3ccc6EE3x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
Class_Descriptor cd__ZN3ccc6EE3x12E = {  "_ZN3ccc6EE3x12E", // class name
  bases__ZN3ccc6EE3x12E, 1,
  &(vtc__ZN3ccc6EE3x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x12E),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
namespace ccc { 
struct  EE3x13  : virtual ::ccc::AA3 {
  virtual void  efg(); // _ZN3ccc6EE3x133efgEv
  ~EE3x13(); // tgen
  EE3x13(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x13E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE3x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE3x133efgEv");}
ccc::EE3x13 ::~EE3x13(){ note_dtor("_ZN3ccc6EE3x13E", this);} // tgen
ccc::EE3x13 ::EE3x13(){ note_ctor("_ZN3ccc6EE3x13E", this);} // tgen
}
static void Test__ZN3ccc6EE3x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x13E, buf);
    ::ccc::EE3x13 *dp, &lv = *(dp=new (buf) ::ccc::EE3x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x13E);
    dp->::ccc::EE3x13::~EE3x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x13E(Test__ZN3ccc6EE3x13E, "_ZN3ccc6EE3x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x13C1Ev();
extern void _ZN3ccc6EE3x13D1Ev();
Name_Map name_map__ZN3ccc6EE3x13E[] = {
  NSPAIR(_ZN3ccc6EE3x13C1Ev),
  NSPAIR(_ZN3ccc6EE3x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x13E[];
extern void _ZN3ccc6EE3x133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x13E[] = {
  {&(_ZTVN3ccc6EE3x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
Class_Descriptor cd__ZN3ccc6EE3x13E = {  "_ZN3ccc6EE3x13E", // class name
  bases__ZN3ccc6EE3x13E, 1,
  &(vtc__ZN3ccc6EE3x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x13E),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
namespace ccc { 
struct  EE3x14  : virtual ::ccc::AA3 {
  virtual void  pqr(); // _ZN3ccc6EE3x143pqrEv
  ~EE3x14(); // tgen
  EE3x14(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x14E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE3x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE3x143pqrEv");}
ccc::EE3x14 ::~EE3x14(){ note_dtor("_ZN3ccc6EE3x14E", this);} // tgen
ccc::EE3x14 ::EE3x14(){ note_ctor("_ZN3ccc6EE3x14E", this);} // tgen
}
static void Test__ZN3ccc6EE3x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x14E, buf);
    ::ccc::EE3x14 *dp, &lv = *(dp=new (buf) ::ccc::EE3x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x14E);
    dp->::ccc::EE3x14::~EE3x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x14E(Test__ZN3ccc6EE3x14E, "_ZN3ccc6EE3x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x14C1Ev();
extern void _ZN3ccc6EE3x14D1Ev();
Name_Map name_map__ZN3ccc6EE3x14E[] = {
  NSPAIR(_ZN3ccc6EE3x14C1Ev),
  NSPAIR(_ZN3ccc6EE3x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc6EE3x143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x14E[] = {
  {&(_ZTVN3ccc6EE3x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
Class_Descriptor cd__ZN3ccc6EE3x14E = {  "_ZN3ccc6EE3x14E", // class name
  bases__ZN3ccc6EE3x14E, 1,
  &(vtc__ZN3ccc6EE3x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x14E),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
namespace ccc { 
struct  EE3x15  : virtual ::ccc::AA3 {
  ~EE3x15(); // tgen
  EE3x15(); // tgen
};
//SIG(-1 _ZN3ccc6EE3x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE3x15 ::~EE3x15(){ note_dtor("_ZN3ccc6EE3x15E", this);} // tgen
ccc::EE3x15 ::EE3x15(){ note_ctor("_ZN3ccc6EE3x15E", this);} // tgen
}
static void Test__ZN3ccc6EE3x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE3x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE3x15E, buf);
    ::ccc::EE3x15 *dp, &lv = *(dp=new (buf) ::ccc::EE3x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE3x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE3x15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc6EE3x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE3x15E);
    dp->::ccc::EE3x15::~EE3x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE3x15E(Test__ZN3ccc6EE3x15E, "_ZN3ccc6EE3x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE3x15C1Ev();
extern void _ZN3ccc6EE3x15D1Ev();
Name_Map name_map__ZN3ccc6EE3x15E[] = {
  NSPAIR(_ZN3ccc6EE3x15C1Ev),
  NSPAIR(_ZN3ccc6EE3x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
static Base_Class bases__ZN3ccc6EE3x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE3x15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE3x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE3x15E[] = {
  {&(_ZTVN3ccc6EE3x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE3x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
Class_Descriptor cd__ZN3ccc6EE3x15E = {  "_ZN3ccc6EE3x15E", // class name
  bases__ZN3ccc6EE3x15E, 1,
  &(vtc__ZN3ccc6EE3x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE3x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE3x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE3x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE3x15E),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
namespace ccc { 
struct  AA4  {
  virtual void  pqr(); // _ZN3ccc3AA43pqrEv
  virtual void  abc(); // _ZN3ccc3AA43abcEv
  virtual void  efg(); // _ZN3ccc3AA43efgEv
  ~AA4(); // tgen
  AA4(); // tgen
};
//SIG(-1 _ZN3ccc3AA4E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA4 ::pqr(){vfunc_called(this, "_ZN3ccc3AA43pqrEv");}
void  ccc::AA4 ::abc(){vfunc_called(this, "_ZN3ccc3AA43abcEv");}
void  ccc::AA4 ::efg(){vfunc_called(this, "_ZN3ccc3AA43efgEv");}
ccc::AA4 ::~AA4(){ note_dtor("_ZN3ccc3AA4E", this);} // tgen
ccc::AA4 ::AA4(){ note_ctor("_ZN3ccc3AA4E", this);} // tgen
}
static void Test__ZN3ccc3AA4E()
{
  extern Class_Descriptor cd__ZN3ccc3AA4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA4E, buf);
    ::ccc::AA4 *dp, &lv = *(dp=new (buf) ::ccc::AA4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA4E)");
    test_class_info(&lv, &cd__ZN3ccc3AA4E);
    dp->::ccc::AA4::~AA4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA4E(Test__ZN3ccc3AA4E, "_ZN3ccc3AA4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA4C1Ev();
extern void _ZN3ccc3AA4D1Ev();
Name_Map name_map__ZN3ccc3AA4E[] = {
  NSPAIR(_ZN3ccc3AA4C1Ev),
  NSPAIR(_ZN3ccc3AA4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA4E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
Class_Descriptor cd__ZN3ccc3AA4E = {  "_ZN3ccc3AA4E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA4E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA4E),5, //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
namespace ccc { 
struct  BB4  {
  virtual void  pqr(); // _ZN3ccc3BB43pqrEv
  virtual void  abc(); // _ZN3ccc3BB43abcEv
  virtual void  efg(); // _ZN3ccc3BB43efgEv
  ~BB4(); // tgen
  BB4(); // tgen
};
//SIG(1 _ZN3ccc3BB4E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB4 ::pqr(){vfunc_called(this, "_ZN3ccc3BB43pqrEv");}
void  ccc::BB4 ::abc(){vfunc_called(this, "_ZN3ccc3BB43abcEv");}
void  ccc::BB4 ::efg(){vfunc_called(this, "_ZN3ccc3BB43efgEv");}
ccc::BB4 ::~BB4(){ note_dtor("_ZN3ccc3BB4E", this);} // tgen
ccc::BB4 ::BB4(){ note_ctor("_ZN3ccc3BB4E", this);} // tgen
}
static void Test__ZN3ccc3BB4E()
{
  extern Class_Descriptor cd__ZN3ccc3BB4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB4E, buf);
    ::ccc::BB4 *dp, &lv = *(dp=new (buf) ::ccc::BB4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB4E)");
    test_class_info(&lv, &cd__ZN3ccc3BB4E);
    dp->::ccc::BB4::~BB4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB4E(Test__ZN3ccc3BB4E, "_ZN3ccc3BB4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB4C1Ev();
extern void _ZN3ccc3BB4D1Ev();
Name_Map name_map__ZN3ccc3BB4E[] = {
  NSPAIR(_ZN3ccc3BB4C1Ev),
  NSPAIR(_ZN3ccc3BB4D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB4E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
Class_Descriptor cd__ZN3ccc3BB4E = {  "_ZN3ccc3BB4E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB4E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB4E),5, //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
namespace ccc { 
struct  EE4x0  : virtual ::ccc::AA4 {
  virtual void  abc(); // _ZN3ccc5EE4x03abcEv
  virtual void  efg(); // _ZN3ccc5EE4x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE4x03pqrEv
  ~EE4x0(); // tgen
  EE4x0(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x0E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x03abcEv");}
void  ccc::EE4x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x03efgEv");}
void  ccc::EE4x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x03pqrEv");}
ccc::EE4x0 ::~EE4x0(){ note_dtor("_ZN3ccc5EE4x0E", this);} // tgen
ccc::EE4x0 ::EE4x0(){ note_ctor("_ZN3ccc5EE4x0E", this);} // tgen
}
static void Test__ZN3ccc5EE4x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x0E, buf);
    ::ccc::EE4x0 *dp, &lv = *(dp=new (buf) ::ccc::EE4x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x0E);
    dp->::ccc::EE4x0::~EE4x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x0E(Test__ZN3ccc5EE4x0E, "_ZN3ccc5EE4x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x0C1Ev();
extern void _ZN3ccc5EE4x0D1Ev();
Name_Map name_map__ZN3ccc5EE4x0E[] = {
  NSPAIR(_ZN3ccc5EE4x0C1Ev),
  NSPAIR(_ZN3ccc5EE4x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x0E[];
extern void _ZN3ccc5EE4x03pqrEv();
extern void _ZN3ccc5EE4x03abcEv();
extern void _ZN3ccc5EE4x03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x0E[] = {
  {&(_ZTVN3ccc5EE4x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
Class_Descriptor cd__ZN3ccc5EE4x0E = {  "_ZN3ccc5EE4x0E", // class name
  bases__ZN3ccc5EE4x0E, 1,
  &(vtc__ZN3ccc5EE4x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x0E),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
namespace ccc { 
struct  EE4x1  : virtual ::ccc::AA4 {
  virtual void  abc(); // _ZN3ccc5EE4x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE4x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE4x13efgEv
  ~EE4x1(); // tgen
  EE4x1(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x1E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x13abcEv");}
void  ccc::EE4x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x13pqrEv");}
void  ccc::EE4x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x13efgEv");}
ccc::EE4x1 ::~EE4x1(){ note_dtor("_ZN3ccc5EE4x1E", this);} // tgen
ccc::EE4x1 ::EE4x1(){ note_ctor("_ZN3ccc5EE4x1E", this);} // tgen
}
static void Test__ZN3ccc5EE4x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x1E, buf);
    ::ccc::EE4x1 *dp, &lv = *(dp=new (buf) ::ccc::EE4x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x1E);
    dp->::ccc::EE4x1::~EE4x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x1E(Test__ZN3ccc5EE4x1E, "_ZN3ccc5EE4x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x1C1Ev();
extern void _ZN3ccc5EE4x1D1Ev();
Name_Map name_map__ZN3ccc5EE4x1E[] = {
  NSPAIR(_ZN3ccc5EE4x1C1Ev),
  NSPAIR(_ZN3ccc5EE4x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x1E[];
extern void _ZN3ccc5EE4x13pqrEv();
extern void _ZN3ccc5EE4x13abcEv();
extern void _ZN3ccc5EE4x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x1E[] = {
  {&(_ZTVN3ccc5EE4x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
Class_Descriptor cd__ZN3ccc5EE4x1E = {  "_ZN3ccc5EE4x1E", // class name
  bases__ZN3ccc5EE4x1E, 1,
  &(vtc__ZN3ccc5EE4x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x1E),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
namespace ccc { 
struct  EE4x2  : virtual ::ccc::AA4 {
  virtual void  efg(); // _ZN3ccc5EE4x23efgEv
  virtual void  abc(); // _ZN3ccc5EE4x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE4x23pqrEv
  ~EE4x2(); // tgen
  EE4x2(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x2E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x23efgEv");}
void  ccc::EE4x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x23abcEv");}
void  ccc::EE4x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x23pqrEv");}
ccc::EE4x2 ::~EE4x2(){ note_dtor("_ZN3ccc5EE4x2E", this);} // tgen
ccc::EE4x2 ::EE4x2(){ note_ctor("_ZN3ccc5EE4x2E", this);} // tgen
}
static void Test__ZN3ccc5EE4x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x2E, buf);
    ::ccc::EE4x2 *dp, &lv = *(dp=new (buf) ::ccc::EE4x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x2E);
    dp->::ccc::EE4x2::~EE4x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x2E(Test__ZN3ccc5EE4x2E, "_ZN3ccc5EE4x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x2C1Ev();
extern void _ZN3ccc5EE4x2D1Ev();
Name_Map name_map__ZN3ccc5EE4x2E[] = {
  NSPAIR(_ZN3ccc5EE4x2C1Ev),
  NSPAIR(_ZN3ccc5EE4x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x2E[];
extern void _ZN3ccc5EE4x23pqrEv();
extern void _ZN3ccc5EE4x23abcEv();
extern void _ZN3ccc5EE4x23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x2E[] = {
  {&(_ZTVN3ccc5EE4x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
Class_Descriptor cd__ZN3ccc5EE4x2E = {  "_ZN3ccc5EE4x2E", // class name
  bases__ZN3ccc5EE4x2E, 1,
  &(vtc__ZN3ccc5EE4x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x2E),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
namespace ccc { 
struct  EE4x3  : virtual ::ccc::AA4 {
  virtual void  efg(); // _ZN3ccc5EE4x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE4x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE4x33abcEv
  ~EE4x3(); // tgen
  EE4x3(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x3E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x33efgEv");}
void  ccc::EE4x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x33pqrEv");}
void  ccc::EE4x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x33abcEv");}
ccc::EE4x3 ::~EE4x3(){ note_dtor("_ZN3ccc5EE4x3E", this);} // tgen
ccc::EE4x3 ::EE4x3(){ note_ctor("_ZN3ccc5EE4x3E", this);} // tgen
}
static void Test__ZN3ccc5EE4x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x3E, buf);
    ::ccc::EE4x3 *dp, &lv = *(dp=new (buf) ::ccc::EE4x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x3E);
    dp->::ccc::EE4x3::~EE4x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x3E(Test__ZN3ccc5EE4x3E, "_ZN3ccc5EE4x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x3C1Ev();
extern void _ZN3ccc5EE4x3D1Ev();
Name_Map name_map__ZN3ccc5EE4x3E[] = {
  NSPAIR(_ZN3ccc5EE4x3C1Ev),
  NSPAIR(_ZN3ccc5EE4x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x3E[];
extern void _ZN3ccc5EE4x33pqrEv();
extern void _ZN3ccc5EE4x33abcEv();
extern void _ZN3ccc5EE4x33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x3E[] = {
  {&(_ZTVN3ccc5EE4x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
Class_Descriptor cd__ZN3ccc5EE4x3E = {  "_ZN3ccc5EE4x3E", // class name
  bases__ZN3ccc5EE4x3E, 1,
  &(vtc__ZN3ccc5EE4x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x3E),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
namespace ccc { 
struct  EE4x4  : virtual ::ccc::AA4 {
  virtual void  pqr(); // _ZN3ccc5EE4x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE4x43abcEv
  virtual void  efg(); // _ZN3ccc5EE4x43efgEv
  ~EE4x4(); // tgen
  EE4x4(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x4E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x43pqrEv");}
void  ccc::EE4x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x43abcEv");}
void  ccc::EE4x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x43efgEv");}
ccc::EE4x4 ::~EE4x4(){ note_dtor("_ZN3ccc5EE4x4E", this);} // tgen
ccc::EE4x4 ::EE4x4(){ note_ctor("_ZN3ccc5EE4x4E", this);} // tgen
}
static void Test__ZN3ccc5EE4x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x4E, buf);
    ::ccc::EE4x4 *dp, &lv = *(dp=new (buf) ::ccc::EE4x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x4E);
    dp->::ccc::EE4x4::~EE4x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x4E(Test__ZN3ccc5EE4x4E, "_ZN3ccc5EE4x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x4C1Ev();
extern void _ZN3ccc5EE4x4D1Ev();
Name_Map name_map__ZN3ccc5EE4x4E[] = {
  NSPAIR(_ZN3ccc5EE4x4C1Ev),
  NSPAIR(_ZN3ccc5EE4x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x4E[];
extern void _ZN3ccc5EE4x43pqrEv();
extern void _ZN3ccc5EE4x43abcEv();
extern void _ZN3ccc5EE4x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x4E[] = {
  {&(_ZTVN3ccc5EE4x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
Class_Descriptor cd__ZN3ccc5EE4x4E = {  "_ZN3ccc5EE4x4E", // class name
  bases__ZN3ccc5EE4x4E, 1,
  &(vtc__ZN3ccc5EE4x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x4E),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
namespace ccc { 
struct  EE4x5  : virtual ::ccc::AA4 {
  virtual void  pqr(); // _ZN3ccc5EE4x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE4x53efgEv
  virtual void  abc(); // _ZN3ccc5EE4x53abcEv
  ~EE4x5(); // tgen
  EE4x5(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x5E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE4x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x53pqrEv");}
void  ccc::EE4x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x53efgEv");}
void  ccc::EE4x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x53abcEv");}
ccc::EE4x5 ::~EE4x5(){ note_dtor("_ZN3ccc5EE4x5E", this);} // tgen
ccc::EE4x5 ::EE4x5(){ note_ctor("_ZN3ccc5EE4x5E", this);} // tgen
}
static void Test__ZN3ccc5EE4x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x5E, buf);
    ::ccc::EE4x5 *dp, &lv = *(dp=new (buf) ::ccc::EE4x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x5E);
    dp->::ccc::EE4x5::~EE4x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x5E(Test__ZN3ccc5EE4x5E, "_ZN3ccc5EE4x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x5C1Ev();
extern void _ZN3ccc5EE4x5D1Ev();
Name_Map name_map__ZN3ccc5EE4x5E[] = {
  NSPAIR(_ZN3ccc5EE4x5C1Ev),
  NSPAIR(_ZN3ccc5EE4x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x5E[];
extern void _ZN3ccc5EE4x53pqrEv();
extern void _ZN3ccc5EE4x53abcEv();
extern void _ZN3ccc5EE4x53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x5E[] = {
  {&(_ZTVN3ccc5EE4x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
Class_Descriptor cd__ZN3ccc5EE4x5E = {  "_ZN3ccc5EE4x5E", // class name
  bases__ZN3ccc5EE4x5E, 1,
  &(vtc__ZN3ccc5EE4x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x5E),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
namespace ccc { 
struct  EE4x6  : virtual ::ccc::AA4 {
  virtual void  abc(); // _ZN3ccc5EE4x63abcEv
  virtual void  efg(); // _ZN3ccc5EE4x63efgEv
  ~EE4x6(); // tgen
  EE4x6(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x6E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE4x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x63abcEv");}
void  ccc::EE4x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x63efgEv");}
ccc::EE4x6 ::~EE4x6(){ note_dtor("_ZN3ccc5EE4x6E", this);} // tgen
ccc::EE4x6 ::EE4x6(){ note_ctor("_ZN3ccc5EE4x6E", this);} // tgen
}
static void Test__ZN3ccc5EE4x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x6E, buf);
    ::ccc::EE4x6 *dp, &lv = *(dp=new (buf) ::ccc::EE4x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x6E);
    dp->::ccc::EE4x6::~EE4x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x6E(Test__ZN3ccc5EE4x6E, "_ZN3ccc5EE4x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x6C1Ev();
extern void _ZN3ccc5EE4x6D1Ev();
Name_Map name_map__ZN3ccc5EE4x6E[] = {
  NSPAIR(_ZN3ccc5EE4x6C1Ev),
  NSPAIR(_ZN3ccc5EE4x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc5EE4x63abcEv();
extern void _ZN3ccc5EE4x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x6E[] = {
  {&(_ZTVN3ccc5EE4x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
Class_Descriptor cd__ZN3ccc5EE4x6E = {  "_ZN3ccc5EE4x6E", // class name
  bases__ZN3ccc5EE4x6E, 1,
  &(vtc__ZN3ccc5EE4x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x6E),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
namespace ccc { 
struct  EE4x7  : virtual ::ccc::AA4 {
  virtual void  abc(); // _ZN3ccc5EE4x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE4x73pqrEv
  ~EE4x7(); // tgen
  EE4x7(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x7E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE4x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x73abcEv");}
void  ccc::EE4x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x73pqrEv");}
ccc::EE4x7 ::~EE4x7(){ note_dtor("_ZN3ccc5EE4x7E", this);} // tgen
ccc::EE4x7 ::EE4x7(){ note_ctor("_ZN3ccc5EE4x7E", this);} // tgen
}
static void Test__ZN3ccc5EE4x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x7E, buf);
    ::ccc::EE4x7 *dp, &lv = *(dp=new (buf) ::ccc::EE4x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x7E);
    dp->::ccc::EE4x7::~EE4x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x7E(Test__ZN3ccc5EE4x7E, "_ZN3ccc5EE4x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x7C1Ev();
extern void _ZN3ccc5EE4x7D1Ev();
Name_Map name_map__ZN3ccc5EE4x7E[] = {
  NSPAIR(_ZN3ccc5EE4x7C1Ev),
  NSPAIR(_ZN3ccc5EE4x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x7E[];
extern void _ZN3ccc5EE4x73pqrEv();
extern void _ZN3ccc5EE4x73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x7E[] = {
  {&(_ZTVN3ccc5EE4x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
Class_Descriptor cd__ZN3ccc5EE4x7E = {  "_ZN3ccc5EE4x7E", // class name
  bases__ZN3ccc5EE4x7E, 1,
  &(vtc__ZN3ccc5EE4x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x7E),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
namespace ccc { 
struct  EE4x8  : virtual ::ccc::AA4 {
  virtual void  efg(); // _ZN3ccc5EE4x83efgEv
  virtual void  abc(); // _ZN3ccc5EE4x83abcEv
  ~EE4x8(); // tgen
  EE4x8(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x8E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE4x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x83efgEv");}
void  ccc::EE4x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE4x83abcEv");}
ccc::EE4x8 ::~EE4x8(){ note_dtor("_ZN3ccc5EE4x8E", this);} // tgen
ccc::EE4x8 ::EE4x8(){ note_ctor("_ZN3ccc5EE4x8E", this);} // tgen
}
static void Test__ZN3ccc5EE4x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x8E, buf);
    ::ccc::EE4x8 *dp, &lv = *(dp=new (buf) ::ccc::EE4x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x8E);
    dp->::ccc::EE4x8::~EE4x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x8E(Test__ZN3ccc5EE4x8E, "_ZN3ccc5EE4x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x8C1Ev();
extern void _ZN3ccc5EE4x8D1Ev();
Name_Map name_map__ZN3ccc5EE4x8E[] = {
  NSPAIR(_ZN3ccc5EE4x8C1Ev),
  NSPAIR(_ZN3ccc5EE4x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc5EE4x83abcEv();
extern void _ZN3ccc5EE4x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x8E[] = {
  {&(_ZTVN3ccc5EE4x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
Class_Descriptor cd__ZN3ccc5EE4x8E = {  "_ZN3ccc5EE4x8E", // class name
  bases__ZN3ccc5EE4x8E, 1,
  &(vtc__ZN3ccc5EE4x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x8E),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
namespace ccc { 
struct  EE4x9  : virtual ::ccc::AA4 {
  virtual void  efg(); // _ZN3ccc5EE4x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE4x93pqrEv
  ~EE4x9(); // tgen
  EE4x9(); // tgen
};
//SIG(-1 _ZN3ccc5EE4x9E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE4x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE4x93efgEv");}
void  ccc::EE4x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE4x93pqrEv");}
ccc::EE4x9 ::~EE4x9(){ note_dtor("_ZN3ccc5EE4x9E", this);} // tgen
ccc::EE4x9 ::EE4x9(){ note_ctor("_ZN3ccc5EE4x9E", this);} // tgen
}
static void Test__ZN3ccc5EE4x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE4x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE4x9E, buf);
    ::ccc::EE4x9 *dp, &lv = *(dp=new (buf) ::ccc::EE4x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE4x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE4x9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc5EE4x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE4x9E);
    dp->::ccc::EE4x9::~EE4x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE4x9E(Test__ZN3ccc5EE4x9E, "_ZN3ccc5EE4x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE4x9C1Ev();
extern void _ZN3ccc5EE4x9D1Ev();
Name_Map name_map__ZN3ccc5EE4x9E[] = {
  NSPAIR(_ZN3ccc5EE4x9C1Ev),
  NSPAIR(_ZN3ccc5EE4x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc5EE4x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE4x9E[];
extern void _ZN3ccc5EE4x93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc5EE4x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE4x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE4x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE4x9E[] = {
  {&(_ZTVN3ccc5EE4x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE4x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
Class_Descriptor cd__ZN3ccc5EE4x9E = {  "_ZN3ccc5EE4x9E", // class name
  bases__ZN3ccc5EE4x9E, 1,
  &(vtc__ZN3ccc5EE4x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE4x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE4x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE4x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE4x9E),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
namespace ccc { 
struct  EE4x10  : virtual ::ccc::AA4 {
  virtual void  pqr(); // _ZN3ccc6EE4x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE4x103abcEv
  ~EE4x10(); // tgen
  EE4x10(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x10E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE4x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE4x103pqrEv");}
void  ccc::EE4x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE4x103abcEv");}
ccc::EE4x10 ::~EE4x10(){ note_dtor("_ZN3ccc6EE4x10E", this);} // tgen
ccc::EE4x10 ::EE4x10(){ note_ctor("_ZN3ccc6EE4x10E", this);} // tgen
}
static void Test__ZN3ccc6EE4x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x10E, buf);
    ::ccc::EE4x10 *dp, &lv = *(dp=new (buf) ::ccc::EE4x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x10E);
    dp->::ccc::EE4x10::~EE4x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x10E(Test__ZN3ccc6EE4x10E, "_ZN3ccc6EE4x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x10C1Ev();
extern void _ZN3ccc6EE4x10D1Ev();
Name_Map name_map__ZN3ccc6EE4x10E[] = {
  NSPAIR(_ZN3ccc6EE4x10C1Ev),
  NSPAIR(_ZN3ccc6EE4x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x10E[];
extern void _ZN3ccc6EE4x103pqrEv();
extern void _ZN3ccc6EE4x103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x10E[] = {
  {&(_ZTVN3ccc6EE4x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
Class_Descriptor cd__ZN3ccc6EE4x10E = {  "_ZN3ccc6EE4x10E", // class name
  bases__ZN3ccc6EE4x10E, 1,
  &(vtc__ZN3ccc6EE4x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x10E),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
namespace ccc { 
struct  EE4x11  : virtual ::ccc::AA4 {
  virtual void  pqr(); // _ZN3ccc6EE4x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE4x113efgEv
  ~EE4x11(); // tgen
  EE4x11(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x11E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE4x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE4x113pqrEv");}
void  ccc::EE4x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE4x113efgEv");}
ccc::EE4x11 ::~EE4x11(){ note_dtor("_ZN3ccc6EE4x11E", this);} // tgen
ccc::EE4x11 ::EE4x11(){ note_ctor("_ZN3ccc6EE4x11E", this);} // tgen
}
static void Test__ZN3ccc6EE4x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x11E, buf);
    ::ccc::EE4x11 *dp, &lv = *(dp=new (buf) ::ccc::EE4x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x11E);
    dp->::ccc::EE4x11::~EE4x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x11E(Test__ZN3ccc6EE4x11E, "_ZN3ccc6EE4x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x11C1Ev();
extern void _ZN3ccc6EE4x11D1Ev();
Name_Map name_map__ZN3ccc6EE4x11E[] = {
  NSPAIR(_ZN3ccc6EE4x11C1Ev),
  NSPAIR(_ZN3ccc6EE4x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x11E[];
extern void _ZN3ccc6EE4x113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc6EE4x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE4x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x11E[] = {
  {&(_ZTVN3ccc6EE4x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
Class_Descriptor cd__ZN3ccc6EE4x11E = {  "_ZN3ccc6EE4x11E", // class name
  bases__ZN3ccc6EE4x11E, 1,
  &(vtc__ZN3ccc6EE4x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x11E),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
namespace ccc { 
struct  EE4x12  : virtual ::ccc::AA4 {
  virtual void  abc(); // _ZN3ccc6EE4x123abcEv
  ~EE4x12(); // tgen
  EE4x12(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x12E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE4x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE4x123abcEv");}
ccc::EE4x12 ::~EE4x12(){ note_dtor("_ZN3ccc6EE4x12E", this);} // tgen
ccc::EE4x12 ::EE4x12(){ note_ctor("_ZN3ccc6EE4x12E", this);} // tgen
}
static void Test__ZN3ccc6EE4x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x12E, buf);
    ::ccc::EE4x12 *dp, &lv = *(dp=new (buf) ::ccc::EE4x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x12E);
    dp->::ccc::EE4x12::~EE4x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x12E(Test__ZN3ccc6EE4x12E, "_ZN3ccc6EE4x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x12C1Ev();
extern void _ZN3ccc6EE4x12D1Ev();
Name_Map name_map__ZN3ccc6EE4x12E[] = {
  NSPAIR(_ZN3ccc6EE4x12C1Ev),
  NSPAIR(_ZN3ccc6EE4x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc6EE4x123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x12E[] = {
  {&(_ZTVN3ccc6EE4x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
Class_Descriptor cd__ZN3ccc6EE4x12E = {  "_ZN3ccc6EE4x12E", // class name
  bases__ZN3ccc6EE4x12E, 1,
  &(vtc__ZN3ccc6EE4x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x12E),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
namespace ccc { 
struct  EE4x13  : virtual ::ccc::AA4 {
  virtual void  efg(); // _ZN3ccc6EE4x133efgEv
  ~EE4x13(); // tgen
  EE4x13(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x13E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE4x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE4x133efgEv");}
ccc::EE4x13 ::~EE4x13(){ note_dtor("_ZN3ccc6EE4x13E", this);} // tgen
ccc::EE4x13 ::EE4x13(){ note_ctor("_ZN3ccc6EE4x13E", this);} // tgen
}
static void Test__ZN3ccc6EE4x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x13E, buf);
    ::ccc::EE4x13 *dp, &lv = *(dp=new (buf) ::ccc::EE4x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x13E);
    dp->::ccc::EE4x13::~EE4x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x13E(Test__ZN3ccc6EE4x13E, "_ZN3ccc6EE4x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x13C1Ev();
extern void _ZN3ccc6EE4x13D1Ev();
Name_Map name_map__ZN3ccc6EE4x13E[] = {
  NSPAIR(_ZN3ccc6EE4x13C1Ev),
  NSPAIR(_ZN3ccc6EE4x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc6EE4x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE4x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x13E[] = {
  {&(_ZTVN3ccc6EE4x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
Class_Descriptor cd__ZN3ccc6EE4x13E = {  "_ZN3ccc6EE4x13E", // class name
  bases__ZN3ccc6EE4x13E, 1,
  &(vtc__ZN3ccc6EE4x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x13E),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
namespace ccc { 
struct  EE4x14  : virtual ::ccc::AA4 {
  virtual void  pqr(); // _ZN3ccc6EE4x143pqrEv
  ~EE4x14(); // tgen
  EE4x14(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x14E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE4x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE4x143pqrEv");}
ccc::EE4x14 ::~EE4x14(){ note_dtor("_ZN3ccc6EE4x14E", this);} // tgen
ccc::EE4x14 ::EE4x14(){ note_ctor("_ZN3ccc6EE4x14E", this);} // tgen
}
static void Test__ZN3ccc6EE4x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x14E, buf);
    ::ccc::EE4x14 *dp, &lv = *(dp=new (buf) ::ccc::EE4x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x14E);
    dp->::ccc::EE4x14::~EE4x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x14E(Test__ZN3ccc6EE4x14E, "_ZN3ccc6EE4x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x14C1Ev();
extern void _ZN3ccc6EE4x14D1Ev();
Name_Map name_map__ZN3ccc6EE4x14E[] = {
  NSPAIR(_ZN3ccc6EE4x14C1Ev),
  NSPAIR(_ZN3ccc6EE4x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x14E[];
extern void _ZN3ccc6EE4x143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x14E[] = {
  {&(_ZTVN3ccc6EE4x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
Class_Descriptor cd__ZN3ccc6EE4x14E = {  "_ZN3ccc6EE4x14E", // class name
  bases__ZN3ccc6EE4x14E, 1,
  &(vtc__ZN3ccc6EE4x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x14E),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
namespace ccc { 
struct  EE4x15  : virtual ::ccc::AA4 {
  ~EE4x15(); // tgen
  EE4x15(); // tgen
};
//SIG(-1 _ZN3ccc6EE4x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE4x15 ::~EE4x15(){ note_dtor("_ZN3ccc6EE4x15E", this);} // tgen
ccc::EE4x15 ::EE4x15(){ note_ctor("_ZN3ccc6EE4x15E", this);} // tgen
}
static void Test__ZN3ccc6EE4x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE4x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE4x15E, buf);
    ::ccc::EE4x15 *dp, &lv = *(dp=new (buf) ::ccc::EE4x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE4x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE4x15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc6EE4x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE4x15E);
    dp->::ccc::EE4x15::~EE4x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE4x15E(Test__ZN3ccc6EE4x15E, "_ZN3ccc6EE4x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE4x15C1Ev();
extern void _ZN3ccc6EE4x15D1Ev();
Name_Map name_map__ZN3ccc6EE4x15E[] = {
  NSPAIR(_ZN3ccc6EE4x15C1Ev),
  NSPAIR(_ZN3ccc6EE4x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
static Base_Class bases__ZN3ccc6EE4x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE4x15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE4x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE4x15E[] = {
  {&(_ZTVN3ccc6EE4x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE4x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
Class_Descriptor cd__ZN3ccc6EE4x15E = {  "_ZN3ccc6EE4x15E", // class name
  bases__ZN3ccc6EE4x15E, 1,
  &(vtc__ZN3ccc6EE4x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE4x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE4x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE4x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE4x15E),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
namespace ccc { 
struct  AA5  {
  virtual void  pqr(); // _ZN3ccc3AA53pqrEv
  virtual void  efg(); // _ZN3ccc3AA53efgEv
  virtual void  abc(); // _ZN3ccc3AA53abcEv
  ~AA5(); // tgen
  AA5(); // tgen
};
//SIG(-1 _ZN3ccc3AA5E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::AA5 ::pqr(){vfunc_called(this, "_ZN3ccc3AA53pqrEv");}
void  ccc::AA5 ::efg(){vfunc_called(this, "_ZN3ccc3AA53efgEv");}
void  ccc::AA5 ::abc(){vfunc_called(this, "_ZN3ccc3AA53abcEv");}
ccc::AA5 ::~AA5(){ note_dtor("_ZN3ccc3AA5E", this);} // tgen
ccc::AA5 ::AA5(){ note_ctor("_ZN3ccc3AA5E", this);} // tgen
}
static void Test__ZN3ccc3AA5E()
{
  extern Class_Descriptor cd__ZN3ccc3AA5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA5E, buf);
    ::ccc::AA5 *dp, &lv = *(dp=new (buf) ::ccc::AA5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA5E)");
    test_class_info(&lv, &cd__ZN3ccc3AA5E);
    dp->::ccc::AA5::~AA5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA5E(Test__ZN3ccc3AA5E, "_ZN3ccc3AA5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA5C1Ev();
extern void _ZN3ccc3AA5D1Ev();
Name_Map name_map__ZN3ccc3AA5E[] = {
  NSPAIR(_ZN3ccc3AA5C1Ev),
  NSPAIR(_ZN3ccc3AA5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA5E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
Class_Descriptor cd__ZN3ccc3AA5E = {  "_ZN3ccc3AA5E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA5E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA5E),5, //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
namespace ccc { 
struct  BB5  {
  virtual void  pqr(); // _ZN3ccc3BB53pqrEv
  virtual void  efg(); // _ZN3ccc3BB53efgEv
  virtual void  abc(); // _ZN3ccc3BB53abcEv
  ~BB5(); // tgen
  BB5(); // tgen
};
//SIG(1 _ZN3ccc3BB5E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB5 ::pqr(){vfunc_called(this, "_ZN3ccc3BB53pqrEv");}
void  ccc::BB5 ::efg(){vfunc_called(this, "_ZN3ccc3BB53efgEv");}
void  ccc::BB5 ::abc(){vfunc_called(this, "_ZN3ccc3BB53abcEv");}
ccc::BB5 ::~BB5(){ note_dtor("_ZN3ccc3BB5E", this);} // tgen
ccc::BB5 ::BB5(){ note_ctor("_ZN3ccc3BB5E", this);} // tgen
}
static void Test__ZN3ccc3BB5E()
{
  extern Class_Descriptor cd__ZN3ccc3BB5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB5E, buf);
    ::ccc::BB5 *dp, &lv = *(dp=new (buf) ::ccc::BB5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB5E)");
    test_class_info(&lv, &cd__ZN3ccc3BB5E);
    dp->::ccc::BB5::~BB5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB5E(Test__ZN3ccc3BB5E, "_ZN3ccc3BB5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB5C1Ev();
extern void _ZN3ccc3BB5D1Ev();
Name_Map name_map__ZN3ccc3BB5E[] = {
  NSPAIR(_ZN3ccc3BB5C1Ev),
  NSPAIR(_ZN3ccc3BB5D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB5E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
Class_Descriptor cd__ZN3ccc3BB5E = {  "_ZN3ccc3BB5E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB5E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB5E),5, //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
namespace ccc { 
struct  EE5x0  : virtual ::ccc::AA5 {
  virtual void  abc(); // _ZN3ccc5EE5x03abcEv
  virtual void  efg(); // _ZN3ccc5EE5x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE5x03pqrEv
  ~EE5x0(); // tgen
  EE5x0(); // tgen
};
//SIG(1 _ZN3ccc5EE5x0E) C1{ VBC2{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x03abcEv");}
void  ccc::EE5x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x03efgEv");}
void  ccc::EE5x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x03pqrEv");}
ccc::EE5x0 ::~EE5x0(){ note_dtor("_ZN3ccc5EE5x0E", this);} // tgen
ccc::EE5x0 ::EE5x0(){ note_ctor("_ZN3ccc5EE5x0E", this);} // tgen
}
static void Test__ZN3ccc5EE5x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x0E, buf);
    ::ccc::EE5x0 *dp, &lv = *(dp=new (buf) ::ccc::EE5x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x0E);
    dp->::ccc::EE5x0::~EE5x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x0E(Test__ZN3ccc5EE5x0E, "_ZN3ccc5EE5x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x0C1Ev();
extern void _ZN3ccc5EE5x0D1Ev();
Name_Map name_map__ZN3ccc5EE5x0E[] = {
  NSPAIR(_ZN3ccc5EE5x0C1Ev),
  NSPAIR(_ZN3ccc5EE5x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x0E[];
extern void _ZN3ccc5EE5x03pqrEv();
extern void _ZN3ccc5EE5x03efgEv();
extern void _ZN3ccc5EE5x03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x0E[] = {
  {&(_ZTVN3ccc5EE5x0E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x0E[];
Class_Descriptor cd__ZN3ccc5EE5x0E = {  "_ZN3ccc5EE5x0E", // class name
  bases__ZN3ccc5EE5x0E, 1,
  &(vtc__ZN3ccc5EE5x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x0E),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
namespace ccc { 
struct  EE5x1  : virtual ::ccc::AA5 {
  virtual void  abc(); // _ZN3ccc5EE5x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE5x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE5x13efgEv
  ~EE5x1(); // tgen
  EE5x1(); // tgen
};
//SIG(1 _ZN3ccc5EE5x1E) C1{ VBC2{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x13abcEv");}
void  ccc::EE5x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x13pqrEv");}
void  ccc::EE5x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x13efgEv");}
ccc::EE5x1 ::~EE5x1(){ note_dtor("_ZN3ccc5EE5x1E", this);} // tgen
ccc::EE5x1 ::EE5x1(){ note_ctor("_ZN3ccc5EE5x1E", this);} // tgen
}
static void Test__ZN3ccc5EE5x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x1E, buf);
    ::ccc::EE5x1 *dp, &lv = *(dp=new (buf) ::ccc::EE5x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x1E);
    dp->::ccc::EE5x1::~EE5x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x1E(Test__ZN3ccc5EE5x1E, "_ZN3ccc5EE5x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x1C1Ev();
extern void _ZN3ccc5EE5x1D1Ev();
Name_Map name_map__ZN3ccc5EE5x1E[] = {
  NSPAIR(_ZN3ccc5EE5x1C1Ev),
  NSPAIR(_ZN3ccc5EE5x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x1E[];
extern void _ZN3ccc5EE5x13pqrEv();
extern void _ZN3ccc5EE5x13efgEv();
extern void _ZN3ccc5EE5x13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x1E[] = {
  {&(_ZTVN3ccc5EE5x1E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x1E[];
Class_Descriptor cd__ZN3ccc5EE5x1E = {  "_ZN3ccc5EE5x1E", // class name
  bases__ZN3ccc5EE5x1E, 1,
  &(vtc__ZN3ccc5EE5x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x1E),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
namespace ccc { 
struct  EE5x2  : virtual ::ccc::AA5 {
  virtual void  efg(); // _ZN3ccc5EE5x23efgEv
  virtual void  abc(); // _ZN3ccc5EE5x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE5x23pqrEv
  ~EE5x2(); // tgen
  EE5x2(); // tgen
};
//SIG(1 _ZN3ccc5EE5x2E) C1{ VBC2{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x23efgEv");}
void  ccc::EE5x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x23abcEv");}
void  ccc::EE5x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x23pqrEv");}
ccc::EE5x2 ::~EE5x2(){ note_dtor("_ZN3ccc5EE5x2E", this);} // tgen
ccc::EE5x2 ::EE5x2(){ note_ctor("_ZN3ccc5EE5x2E", this);} // tgen
}
static void Test__ZN3ccc5EE5x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x2E, buf);
    ::ccc::EE5x2 *dp, &lv = *(dp=new (buf) ::ccc::EE5x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x2E);
    dp->::ccc::EE5x2::~EE5x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x2E(Test__ZN3ccc5EE5x2E, "_ZN3ccc5EE5x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x2C1Ev();
extern void _ZN3ccc5EE5x2D1Ev();
Name_Map name_map__ZN3ccc5EE5x2E[] = {
  NSPAIR(_ZN3ccc5EE5x2C1Ev),
  NSPAIR(_ZN3ccc5EE5x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x2E[];
extern void _ZN3ccc5EE5x23pqrEv();
extern void _ZN3ccc5EE5x23efgEv();
extern void _ZN3ccc5EE5x23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x2E[] = {
  {&(_ZTVN3ccc5EE5x2E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x2E[];
Class_Descriptor cd__ZN3ccc5EE5x2E = {  "_ZN3ccc5EE5x2E", // class name
  bases__ZN3ccc5EE5x2E, 1,
  &(vtc__ZN3ccc5EE5x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x2E),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
namespace ccc { 
struct  EE5x3  : virtual ::ccc::AA5 {
  virtual void  efg(); // _ZN3ccc5EE5x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE5x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE5x33abcEv
  ~EE5x3(); // tgen
  EE5x3(); // tgen
};
//SIG(1 _ZN3ccc5EE5x3E) C1{ VBC2{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x33efgEv");}
void  ccc::EE5x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x33pqrEv");}
void  ccc::EE5x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x33abcEv");}
ccc::EE5x3 ::~EE5x3(){ note_dtor("_ZN3ccc5EE5x3E", this);} // tgen
ccc::EE5x3 ::EE5x3(){ note_ctor("_ZN3ccc5EE5x3E", this);} // tgen
}
static void Test__ZN3ccc5EE5x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x3E, buf);
    ::ccc::EE5x3 *dp, &lv = *(dp=new (buf) ::ccc::EE5x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x3E);
    dp->::ccc::EE5x3::~EE5x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x3E(Test__ZN3ccc5EE5x3E, "_ZN3ccc5EE5x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x3C1Ev();
extern void _ZN3ccc5EE5x3D1Ev();
Name_Map name_map__ZN3ccc5EE5x3E[] = {
  NSPAIR(_ZN3ccc5EE5x3C1Ev),
  NSPAIR(_ZN3ccc5EE5x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x3E[];
extern void _ZN3ccc5EE5x33pqrEv();
extern void _ZN3ccc5EE5x33efgEv();
extern void _ZN3ccc5EE5x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x3E[] = {
  {&(_ZTVN3ccc5EE5x3E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x3E[];
Class_Descriptor cd__ZN3ccc5EE5x3E = {  "_ZN3ccc5EE5x3E", // class name
  bases__ZN3ccc5EE5x3E, 1,
  &(vtc__ZN3ccc5EE5x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x3E),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
namespace ccc { 
struct  EE5x4  : virtual ::ccc::AA5 {
  virtual void  pqr(); // _ZN3ccc5EE5x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE5x43abcEv
  virtual void  efg(); // _ZN3ccc5EE5x43efgEv
  ~EE5x4(); // tgen
  EE5x4(); // tgen
};
//SIG(1 _ZN3ccc5EE5x4E) C1{ VBC2{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x43pqrEv");}
void  ccc::EE5x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x43abcEv");}
void  ccc::EE5x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x43efgEv");}
ccc::EE5x4 ::~EE5x4(){ note_dtor("_ZN3ccc5EE5x4E", this);} // tgen
ccc::EE5x4 ::EE5x4(){ note_ctor("_ZN3ccc5EE5x4E", this);} // tgen
}
static void Test__ZN3ccc5EE5x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x4E, buf);
    ::ccc::EE5x4 *dp, &lv = *(dp=new (buf) ::ccc::EE5x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x4E);
    dp->::ccc::EE5x4::~EE5x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x4E(Test__ZN3ccc5EE5x4E, "_ZN3ccc5EE5x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x4C1Ev();
extern void _ZN3ccc5EE5x4D1Ev();
Name_Map name_map__ZN3ccc5EE5x4E[] = {
  NSPAIR(_ZN3ccc5EE5x4C1Ev),
  NSPAIR(_ZN3ccc5EE5x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x4E[];
extern void _ZN3ccc5EE5x43pqrEv();
extern void _ZN3ccc5EE5x43efgEv();
extern void _ZN3ccc5EE5x43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x4E[] = {
  {&(_ZTVN3ccc5EE5x4E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x4E[];
Class_Descriptor cd__ZN3ccc5EE5x4E = {  "_ZN3ccc5EE5x4E", // class name
  bases__ZN3ccc5EE5x4E, 1,
  &(vtc__ZN3ccc5EE5x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x4E),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
namespace ccc { 
struct  EE5x5  : virtual ::ccc::AA5 {
  virtual void  pqr(); // _ZN3ccc5EE5x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE5x53efgEv
  virtual void  abc(); // _ZN3ccc5EE5x53abcEv
  ~EE5x5(); // tgen
  EE5x5(); // tgen
};
//SIG(1 _ZN3ccc5EE5x5E) C1{ VBC2{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE5x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x53pqrEv");}
void  ccc::EE5x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x53efgEv");}
void  ccc::EE5x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x53abcEv");}
ccc::EE5x5 ::~EE5x5(){ note_dtor("_ZN3ccc5EE5x5E", this);} // tgen
ccc::EE5x5 ::EE5x5(){ note_ctor("_ZN3ccc5EE5x5E", this);} // tgen
}
static void Test__ZN3ccc5EE5x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x5E, buf);
    ::ccc::EE5x5 *dp, &lv = *(dp=new (buf) ::ccc::EE5x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x5E);
    dp->::ccc::EE5x5::~EE5x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x5E(Test__ZN3ccc5EE5x5E, "_ZN3ccc5EE5x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x5C1Ev();
extern void _ZN3ccc5EE5x5D1Ev();
Name_Map name_map__ZN3ccc5EE5x5E[] = {
  NSPAIR(_ZN3ccc5EE5x5C1Ev),
  NSPAIR(_ZN3ccc5EE5x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x5E[];
extern void _ZN3ccc5EE5x53pqrEv();
extern void _ZN3ccc5EE5x53efgEv();
extern void _ZN3ccc5EE5x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x5E[] = {
  {&(_ZTVN3ccc5EE5x5E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x5E[];
Class_Descriptor cd__ZN3ccc5EE5x5E = {  "_ZN3ccc5EE5x5E", // class name
  bases__ZN3ccc5EE5x5E, 1,
  &(vtc__ZN3ccc5EE5x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x5E),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
namespace ccc { 
struct  EE5x6  : virtual ::ccc::AA5 {
  virtual void  abc(); // _ZN3ccc5EE5x63abcEv
  virtual void  efg(); // _ZN3ccc5EE5x63efgEv
  ~EE5x6(); // tgen
  EE5x6(); // tgen
};
//SIG(1 _ZN3ccc5EE5x6E) C1{ VBC2{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE5x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x63abcEv");}
void  ccc::EE5x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x63efgEv");}
ccc::EE5x6 ::~EE5x6(){ note_dtor("_ZN3ccc5EE5x6E", this);} // tgen
ccc::EE5x6 ::EE5x6(){ note_ctor("_ZN3ccc5EE5x6E", this);} // tgen
}
static void Test__ZN3ccc5EE5x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x6E, buf);
    ::ccc::EE5x6 *dp, &lv = *(dp=new (buf) ::ccc::EE5x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x6E);
    dp->::ccc::EE5x6::~EE5x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x6E(Test__ZN3ccc5EE5x6E, "_ZN3ccc5EE5x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x6C1Ev();
extern void _ZN3ccc5EE5x6D1Ev();
Name_Map name_map__ZN3ccc5EE5x6E[] = {
  NSPAIR(_ZN3ccc5EE5x6C1Ev),
  NSPAIR(_ZN3ccc5EE5x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc5EE5x63efgEv();
extern void _ZN3ccc5EE5x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x6E[] = {
  {&(_ZTVN3ccc5EE5x6E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x6E[];
Class_Descriptor cd__ZN3ccc5EE5x6E = {  "_ZN3ccc5EE5x6E", // class name
  bases__ZN3ccc5EE5x6E, 1,
  &(vtc__ZN3ccc5EE5x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x6E),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
namespace ccc { 
struct  EE5x7  : virtual ::ccc::AA5 {
  virtual void  abc(); // _ZN3ccc5EE5x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE5x73pqrEv
  ~EE5x7(); // tgen
  EE5x7(); // tgen
};
//SIG(1 _ZN3ccc5EE5x7E) C1{ VBC2{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE5x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x73abcEv");}
void  ccc::EE5x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x73pqrEv");}
ccc::EE5x7 ::~EE5x7(){ note_dtor("_ZN3ccc5EE5x7E", this);} // tgen
ccc::EE5x7 ::EE5x7(){ note_ctor("_ZN3ccc5EE5x7E", this);} // tgen
}
static void Test__ZN3ccc5EE5x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x7E, buf);
    ::ccc::EE5x7 *dp, &lv = *(dp=new (buf) ::ccc::EE5x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x7E);
    dp->::ccc::EE5x7::~EE5x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x7E(Test__ZN3ccc5EE5x7E, "_ZN3ccc5EE5x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x7C1Ev();
extern void _ZN3ccc5EE5x7D1Ev();
Name_Map name_map__ZN3ccc5EE5x7E[] = {
  NSPAIR(_ZN3ccc5EE5x7C1Ev),
  NSPAIR(_ZN3ccc5EE5x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x7E[];
extern void _ZN3ccc5EE5x73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc5EE5x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x7E[] = {
  {&(_ZTVN3ccc5EE5x7E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x7E[];
Class_Descriptor cd__ZN3ccc5EE5x7E = {  "_ZN3ccc5EE5x7E", // class name
  bases__ZN3ccc5EE5x7E, 1,
  &(vtc__ZN3ccc5EE5x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x7E),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
namespace ccc { 
struct  EE5x8  : virtual ::ccc::AA5 {
  virtual void  efg(); // _ZN3ccc5EE5x83efgEv
  virtual void  abc(); // _ZN3ccc5EE5x83abcEv
  ~EE5x8(); // tgen
  EE5x8(); // tgen
};
//SIG(1 _ZN3ccc5EE5x8E) C1{ VBC2{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE5x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x83efgEv");}
void  ccc::EE5x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE5x83abcEv");}
ccc::EE5x8 ::~EE5x8(){ note_dtor("_ZN3ccc5EE5x8E", this);} // tgen
ccc::EE5x8 ::EE5x8(){ note_ctor("_ZN3ccc5EE5x8E", this);} // tgen
}
static void Test__ZN3ccc5EE5x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x8E, buf);
    ::ccc::EE5x8 *dp, &lv = *(dp=new (buf) ::ccc::EE5x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x8E);
    dp->::ccc::EE5x8::~EE5x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x8E(Test__ZN3ccc5EE5x8E, "_ZN3ccc5EE5x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x8C1Ev();
extern void _ZN3ccc5EE5x8D1Ev();
Name_Map name_map__ZN3ccc5EE5x8E[] = {
  NSPAIR(_ZN3ccc5EE5x8C1Ev),
  NSPAIR(_ZN3ccc5EE5x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc5EE5x83efgEv();
extern void _ZN3ccc5EE5x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x8E[] = {
  {&(_ZTVN3ccc5EE5x8E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x8E[];
Class_Descriptor cd__ZN3ccc5EE5x8E = {  "_ZN3ccc5EE5x8E", // class name
  bases__ZN3ccc5EE5x8E, 1,
  &(vtc__ZN3ccc5EE5x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x8E),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
namespace ccc { 
struct  EE5x9  : virtual ::ccc::AA5 {
  virtual void  efg(); // _ZN3ccc5EE5x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE5x93pqrEv
  ~EE5x9(); // tgen
  EE5x9(); // tgen
};
//SIG(1 _ZN3ccc5EE5x9E) C1{ VBC2{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE5x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE5x93efgEv");}
void  ccc::EE5x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE5x93pqrEv");}
ccc::EE5x9 ::~EE5x9(){ note_dtor("_ZN3ccc5EE5x9E", this);} // tgen
ccc::EE5x9 ::EE5x9(){ note_ctor("_ZN3ccc5EE5x9E", this);} // tgen
}
static void Test__ZN3ccc5EE5x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE5x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE5x9E, buf);
    ::ccc::EE5x9 *dp, &lv = *(dp=new (buf) ::ccc::EE5x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE5x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE5x9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc5EE5x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE5x9E);
    dp->::ccc::EE5x9::~EE5x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE5x9E(Test__ZN3ccc5EE5x9E, "_ZN3ccc5EE5x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE5x9C1Ev();
extern void _ZN3ccc5EE5x9D1Ev();
Name_Map name_map__ZN3ccc5EE5x9E[] = {
  NSPAIR(_ZN3ccc5EE5x9C1Ev),
  NSPAIR(_ZN3ccc5EE5x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc5EE5x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc5EE5x9E[];
extern void _ZN3ccc5EE5x93pqrEv();
extern void _ZN3ccc5EE5x93efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE5x9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE5x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE5x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE5x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE5x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE5x9E[] = {
  {&(_ZTVN3ccc5EE5x9E[6]),  6,9},
  {&(_ZTVN3ccc5EE5x9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc5EE5x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE5x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE5x9E[];
Class_Descriptor cd__ZN3ccc5EE5x9E = {  "_ZN3ccc5EE5x9E", // class name
  bases__ZN3ccc5EE5x9E, 1,
  &(vtc__ZN3ccc5EE5x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE5x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE5x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE5x9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE5x9E),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
namespace ccc { 
struct  EE5x10  : virtual ::ccc::AA5 {
  virtual void  pqr(); // _ZN3ccc6EE5x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE5x103abcEv
  ~EE5x10(); // tgen
  EE5x10(); // tgen
};
//SIG(1 _ZN3ccc6EE5x10E) C1{ VBC2{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE5x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE5x103pqrEv");}
void  ccc::EE5x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE5x103abcEv");}
ccc::EE5x10 ::~EE5x10(){ note_dtor("_ZN3ccc6EE5x10E", this);} // tgen
ccc::EE5x10 ::EE5x10(){ note_ctor("_ZN3ccc6EE5x10E", this);} // tgen
}
static void Test__ZN3ccc6EE5x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x10E, buf);
    ::ccc::EE5x10 *dp, &lv = *(dp=new (buf) ::ccc::EE5x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x10E);
    dp->::ccc::EE5x10::~EE5x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x10E(Test__ZN3ccc6EE5x10E, "_ZN3ccc6EE5x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x10C1Ev();
extern void _ZN3ccc6EE5x10D1Ev();
Name_Map name_map__ZN3ccc6EE5x10E[] = {
  NSPAIR(_ZN3ccc6EE5x10C1Ev),
  NSPAIR(_ZN3ccc6EE5x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x10E[];
extern void _ZN3ccc6EE5x103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc6EE5x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE5x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE5x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x10E[] = {
  {&(_ZTVN3ccc6EE5x10E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x10E[];
Class_Descriptor cd__ZN3ccc6EE5x10E = {  "_ZN3ccc6EE5x10E", // class name
  bases__ZN3ccc6EE5x10E, 1,
  &(vtc__ZN3ccc6EE5x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x10E),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
namespace ccc { 
struct  EE5x11  : virtual ::ccc::AA5 {
  virtual void  pqr(); // _ZN3ccc6EE5x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE5x113efgEv
  ~EE5x11(); // tgen
  EE5x11(); // tgen
};
//SIG(1 _ZN3ccc6EE5x11E) C1{ VBC2{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE5x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE5x113pqrEv");}
void  ccc::EE5x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE5x113efgEv");}
ccc::EE5x11 ::~EE5x11(){ note_dtor("_ZN3ccc6EE5x11E", this);} // tgen
ccc::EE5x11 ::EE5x11(){ note_ctor("_ZN3ccc6EE5x11E", this);} // tgen
}
static void Test__ZN3ccc6EE5x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x11E, buf);
    ::ccc::EE5x11 *dp, &lv = *(dp=new (buf) ::ccc::EE5x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x11E);
    dp->::ccc::EE5x11::~EE5x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x11E(Test__ZN3ccc6EE5x11E, "_ZN3ccc6EE5x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x11C1Ev();
extern void _ZN3ccc6EE5x11D1Ev();
Name_Map name_map__ZN3ccc6EE5x11E[] = {
  NSPAIR(_ZN3ccc6EE5x11C1Ev),
  NSPAIR(_ZN3ccc6EE5x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x11E[];
extern void _ZN3ccc6EE5x113pqrEv();
extern void _ZN3ccc6EE5x113efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE5x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE5x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x11E[] = {
  {&(_ZTVN3ccc6EE5x11E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x11E[];
Class_Descriptor cd__ZN3ccc6EE5x11E = {  "_ZN3ccc6EE5x11E", // class name
  bases__ZN3ccc6EE5x11E, 1,
  &(vtc__ZN3ccc6EE5x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x11E),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
namespace ccc { 
struct  EE5x12  : virtual ::ccc::AA5 {
  virtual void  abc(); // _ZN3ccc6EE5x123abcEv
  ~EE5x12(); // tgen
  EE5x12(); // tgen
};
//SIG(1 _ZN3ccc6EE5x12E) C1{ VBC2{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::EE5x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE5x123abcEv");}
ccc::EE5x12 ::~EE5x12(){ note_dtor("_ZN3ccc6EE5x12E", this);} // tgen
ccc::EE5x12 ::EE5x12(){ note_ctor("_ZN3ccc6EE5x12E", this);} // tgen
}
static void Test__ZN3ccc6EE5x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x12E, buf);
    ::ccc::EE5x12 *dp, &lv = *(dp=new (buf) ::ccc::EE5x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x12E);
    dp->::ccc::EE5x12::~EE5x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x12E(Test__ZN3ccc6EE5x12E, "_ZN3ccc6EE5x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x12C1Ev();
extern void _ZN3ccc6EE5x12D1Ev();
Name_Map name_map__ZN3ccc6EE5x12E[] = {
  NSPAIR(_ZN3ccc6EE5x12C1Ev),
  NSPAIR(_ZN3ccc6EE5x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc6EE5x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE5x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x12E[] = {
  {&(_ZTVN3ccc6EE5x12E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x12E[];
Class_Descriptor cd__ZN3ccc6EE5x12E = {  "_ZN3ccc6EE5x12E", // class name
  bases__ZN3ccc6EE5x12E, 1,
  &(vtc__ZN3ccc6EE5x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x12E),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
namespace ccc { 
struct  EE5x13  : virtual ::ccc::AA5 {
  virtual void  efg(); // _ZN3ccc6EE5x133efgEv
  ~EE5x13(); // tgen
  EE5x13(); // tgen
};
//SIG(1 _ZN3ccc6EE5x13E) C1{ VBC2{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::EE5x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE5x133efgEv");}
ccc::EE5x13 ::~EE5x13(){ note_dtor("_ZN3ccc6EE5x13E", this);} // tgen
ccc::EE5x13 ::EE5x13(){ note_ctor("_ZN3ccc6EE5x13E", this);} // tgen
}
static void Test__ZN3ccc6EE5x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x13E, buf);
    ::ccc::EE5x13 *dp, &lv = *(dp=new (buf) ::ccc::EE5x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x13E);
    dp->::ccc::EE5x13::~EE5x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x13E(Test__ZN3ccc6EE5x13E, "_ZN3ccc6EE5x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x13C1Ev();
extern void _ZN3ccc6EE5x13D1Ev();
Name_Map name_map__ZN3ccc6EE5x13E[] = {
  NSPAIR(_ZN3ccc6EE5x13C1Ev),
  NSPAIR(_ZN3ccc6EE5x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc6EE5x133efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE5x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x13E[] = {
  {&(_ZTVN3ccc6EE5x13E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x13E[];
Class_Descriptor cd__ZN3ccc6EE5x13E = {  "_ZN3ccc6EE5x13E", // class name
  bases__ZN3ccc6EE5x13E, 1,
  &(vtc__ZN3ccc6EE5x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x13E),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
namespace ccc { 
struct  EE5x14  : virtual ::ccc::AA5 {
  virtual void  pqr(); // _ZN3ccc6EE5x143pqrEv
  ~EE5x14(); // tgen
  EE5x14(); // tgen
};
//SIG(1 _ZN3ccc6EE5x14E) C1{ VBC2{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::EE5x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE5x143pqrEv");}
ccc::EE5x14 ::~EE5x14(){ note_dtor("_ZN3ccc6EE5x14E", this);} // tgen
ccc::EE5x14 ::EE5x14(){ note_ctor("_ZN3ccc6EE5x14E", this);} // tgen
}
static void Test__ZN3ccc6EE5x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x14E, buf);
    ::ccc::EE5x14 *dp, &lv = *(dp=new (buf) ::ccc::EE5x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x14E);
    dp->::ccc::EE5x14::~EE5x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x14E(Test__ZN3ccc6EE5x14E, "_ZN3ccc6EE5x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x14C1Ev();
extern void _ZN3ccc6EE5x14D1Ev();
Name_Map name_map__ZN3ccc6EE5x14E[] = {
  NSPAIR(_ZN3ccc6EE5x14C1Ev),
  NSPAIR(_ZN3ccc6EE5x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x14E[];
extern void _ZN3ccc6EE5x143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE5x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x14E[] = {
  {&(_ZTVN3ccc6EE5x14E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x14E[];
Class_Descriptor cd__ZN3ccc6EE5x14E = {  "_ZN3ccc6EE5x14E", // class name
  bases__ZN3ccc6EE5x14E, 1,
  &(vtc__ZN3ccc6EE5x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x14E),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
namespace ccc { 
struct  EE5x15  : virtual ::ccc::AA5 {
  ~EE5x15(); // tgen
  EE5x15(); // tgen
};
//SIG(1 _ZN3ccc6EE5x15E) C1{ VBC2{ v1 v2 v3}}
}
namespace ccc { 
ccc::EE5x15 ::~EE5x15(){ note_dtor("_ZN3ccc6EE5x15E", this);} // tgen
ccc::EE5x15 ::EE5x15(){ note_ctor("_ZN3ccc6EE5x15E", this);} // tgen
}
static void Test__ZN3ccc6EE5x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE5x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE5x15E, buf);
    ::ccc::EE5x15 *dp, &lv = *(dp=new (buf) ::ccc::EE5x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE5x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE5x15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc6EE5x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE5x15E);
    dp->::ccc::EE5x15::~EE5x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE5x15E(Test__ZN3ccc6EE5x15E, "_ZN3ccc6EE5x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE5x15C1Ev();
extern void _ZN3ccc6EE5x15D1Ev();
Name_Map name_map__ZN3ccc6EE5x15E[] = {
  NSPAIR(_ZN3ccc6EE5x15C1Ev),
  NSPAIR(_ZN3ccc6EE5x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
static Base_Class bases__ZN3ccc6EE5x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //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 _ZTIN3ccc6EE5x15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE5x15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE5x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE5x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE5x15E[] = {
  {&(_ZTVN3ccc6EE5x15E[6]),  6,9},
  {&(_ZTVN3ccc6EE5x15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc6EE5x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE5x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE5x15E[];
Class_Descriptor cd__ZN3ccc6EE5x15E = {  "_ZN3ccc6EE5x15E", // class name
  bases__ZN3ccc6EE5x15E, 1,
  &(vtc__ZN3ccc6EE5x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE5x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE5x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE5x15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE5x15E),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
namespace ccc { 
struct  AA6  {
  virtual void  abc(); // _ZN3ccc3AA63abcEv
  virtual void  efg(); // _ZN3ccc3AA63efgEv
  ~AA6(); // tgen
  AA6(); // tgen
};
//SIG(-1 _ZN3ccc3AA6E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA6 ::abc(){vfunc_called(this, "_ZN3ccc3AA63abcEv");}
void  ccc::AA6 ::efg(){vfunc_called(this, "_ZN3ccc3AA63efgEv");}
ccc::AA6 ::~AA6(){ note_dtor("_ZN3ccc3AA6E", this);} // tgen
ccc::AA6 ::AA6(){ note_ctor("_ZN3ccc3AA6E", this);} // tgen
}
static void Test__ZN3ccc3AA6E()
{
  extern Class_Descriptor cd__ZN3ccc3AA6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA6E, buf);
    ::ccc::AA6 *dp, &lv = *(dp=new (buf) ::ccc::AA6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA6E)");
    test_class_info(&lv, &cd__ZN3ccc3AA6E);
    dp->::ccc::AA6::~AA6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA6E(Test__ZN3ccc3AA6E, "_ZN3ccc3AA6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA6C1Ev();
extern void _ZN3ccc3AA6D1Ev();
Name_Map name_map__ZN3ccc3AA6E[] = {
  NSPAIR(_ZN3ccc3AA6C1Ev),
  NSPAIR(_ZN3ccc3AA6D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
Class_Descriptor cd__ZN3ccc3AA6E = {  "_ZN3ccc3AA6E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA6E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA6E),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
namespace ccc { 
struct  BB6  {
  virtual void  abc(); // _ZN3ccc3BB63abcEv
  virtual void  efg(); // _ZN3ccc3BB63efgEv
  ~BB6(); // tgen
  BB6(); // tgen
};
//SIG(1 _ZN3ccc3BB6E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB6 ::abc(){vfunc_called(this, "_ZN3ccc3BB63abcEv");}
void  ccc::BB6 ::efg(){vfunc_called(this, "_ZN3ccc3BB63efgEv");}
ccc::BB6 ::~BB6(){ note_dtor("_ZN3ccc3BB6E", this);} // tgen
ccc::BB6 ::BB6(){ note_ctor("_ZN3ccc3BB6E", this);} // tgen
}
static void Test__ZN3ccc3BB6E()
{
  extern Class_Descriptor cd__ZN3ccc3BB6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB6E, buf);
    ::ccc::BB6 *dp, &lv = *(dp=new (buf) ::ccc::BB6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB6E)");
    test_class_info(&lv, &cd__ZN3ccc3BB6E);
    dp->::ccc::BB6::~BB6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB6E(Test__ZN3ccc3BB6E, "_ZN3ccc3BB6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB6C1Ev();
extern void _ZN3ccc3BB6D1Ev();
Name_Map name_map__ZN3ccc3BB6E[] = {
  NSPAIR(_ZN3ccc3BB6C1Ev),
  NSPAIR(_ZN3ccc3BB6D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
Class_Descriptor cd__ZN3ccc3BB6E = {  "_ZN3ccc3BB6E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB6E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB6E),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
namespace ccc { 
struct  EE6x0  : virtual ::ccc::AA6 {
  virtual void  abc(); // _ZN3ccc5EE6x03abcEv
  virtual void  efg(); // _ZN3ccc5EE6x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE6x03pqrEv
  ~EE6x0(); // tgen
  EE6x0(); // tgen
};
//SIG(1 _ZN3ccc5EE6x0E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x03abcEv");}
void  ccc::EE6x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x03efgEv");}
void  ccc::EE6x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x03pqrEv");}
ccc::EE6x0 ::~EE6x0(){ note_dtor("_ZN3ccc5EE6x0E", this);} // tgen
ccc::EE6x0 ::EE6x0(){ note_ctor("_ZN3ccc5EE6x0E", this);} // tgen
}
static void Test__ZN3ccc5EE6x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x0E, buf);
    ::ccc::EE6x0 *dp, &lv = *(dp=new (buf) ::ccc::EE6x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x0E);
    dp->::ccc::EE6x0::~EE6x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x0E(Test__ZN3ccc5EE6x0E, "_ZN3ccc5EE6x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x0C1Ev();
extern void _ZN3ccc5EE6x0D1Ev();
Name_Map name_map__ZN3ccc5EE6x0E[] = {
  NSPAIR(_ZN3ccc5EE6x0C1Ev),
  NSPAIR(_ZN3ccc5EE6x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x0E[];
extern void _ZN3ccc5EE6x03abcEv();
extern void _ZN3ccc5EE6x03efgEv();
extern void _ZN3ccc5EE6x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x0E[] = {
  {&(_ZTVN3ccc5EE6x0E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x0E[];
Class_Descriptor cd__ZN3ccc5EE6x0E = {  "_ZN3ccc5EE6x0E", // class name
  bases__ZN3ccc5EE6x0E, 1,
  &(vtc__ZN3ccc5EE6x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x0E),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
namespace ccc { 
struct  EE6x1  : virtual ::ccc::AA6 {
  virtual void  abc(); // _ZN3ccc5EE6x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE6x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE6x13efgEv
  ~EE6x1(); // tgen
  EE6x1(); // tgen
};
//SIG(1 _ZN3ccc5EE6x1E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x13abcEv");}
void  ccc::EE6x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x13pqrEv");}
void  ccc::EE6x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x13efgEv");}
ccc::EE6x1 ::~EE6x1(){ note_dtor("_ZN3ccc5EE6x1E", this);} // tgen
ccc::EE6x1 ::EE6x1(){ note_ctor("_ZN3ccc5EE6x1E", this);} // tgen
}
static void Test__ZN3ccc5EE6x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x1E, buf);
    ::ccc::EE6x1 *dp, &lv = *(dp=new (buf) ::ccc::EE6x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x1E);
    dp->::ccc::EE6x1::~EE6x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x1E(Test__ZN3ccc5EE6x1E, "_ZN3ccc5EE6x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x1C1Ev();
extern void _ZN3ccc5EE6x1D1Ev();
Name_Map name_map__ZN3ccc5EE6x1E[] = {
  NSPAIR(_ZN3ccc5EE6x1C1Ev),
  NSPAIR(_ZN3ccc5EE6x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x1E[];
extern void _ZN3ccc5EE6x13abcEv();
extern void _ZN3ccc5EE6x13efgEv();
extern void _ZN3ccc5EE6x13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x1E[] = {
  {&(_ZTVN3ccc5EE6x1E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x1E[];
Class_Descriptor cd__ZN3ccc5EE6x1E = {  "_ZN3ccc5EE6x1E", // class name
  bases__ZN3ccc5EE6x1E, 1,
  &(vtc__ZN3ccc5EE6x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x1E),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
namespace ccc { 
struct  EE6x2  : virtual ::ccc::AA6 {
  virtual void  efg(); // _ZN3ccc5EE6x23efgEv
  virtual void  abc(); // _ZN3ccc5EE6x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE6x23pqrEv
  ~EE6x2(); // tgen
  EE6x2(); // tgen
};
//SIG(1 _ZN3ccc5EE6x2E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x23efgEv");}
void  ccc::EE6x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x23abcEv");}
void  ccc::EE6x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x23pqrEv");}
ccc::EE6x2 ::~EE6x2(){ note_dtor("_ZN3ccc5EE6x2E", this);} // tgen
ccc::EE6x2 ::EE6x2(){ note_ctor("_ZN3ccc5EE6x2E", this);} // tgen
}
static void Test__ZN3ccc5EE6x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x2E, buf);
    ::ccc::EE6x2 *dp, &lv = *(dp=new (buf) ::ccc::EE6x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x2E);
    dp->::ccc::EE6x2::~EE6x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x2E(Test__ZN3ccc5EE6x2E, "_ZN3ccc5EE6x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x2C1Ev();
extern void _ZN3ccc5EE6x2D1Ev();
Name_Map name_map__ZN3ccc5EE6x2E[] = {
  NSPAIR(_ZN3ccc5EE6x2C1Ev),
  NSPAIR(_ZN3ccc5EE6x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x2E[];
extern void _ZN3ccc5EE6x23abcEv();
extern void _ZN3ccc5EE6x23efgEv();
extern void _ZN3ccc5EE6x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x2E[] = {
  {&(_ZTVN3ccc5EE6x2E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x2E[];
Class_Descriptor cd__ZN3ccc5EE6x2E = {  "_ZN3ccc5EE6x2E", // class name
  bases__ZN3ccc5EE6x2E, 1,
  &(vtc__ZN3ccc5EE6x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x2E),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
namespace ccc { 
struct  EE6x3  : virtual ::ccc::AA6 {
  virtual void  efg(); // _ZN3ccc5EE6x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE6x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE6x33abcEv
  ~EE6x3(); // tgen
  EE6x3(); // tgen
};
//SIG(1 _ZN3ccc5EE6x3E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x33efgEv");}
void  ccc::EE6x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x33pqrEv");}
void  ccc::EE6x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x33abcEv");}
ccc::EE6x3 ::~EE6x3(){ note_dtor("_ZN3ccc5EE6x3E", this);} // tgen
ccc::EE6x3 ::EE6x3(){ note_ctor("_ZN3ccc5EE6x3E", this);} // tgen
}
static void Test__ZN3ccc5EE6x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x3E, buf);
    ::ccc::EE6x3 *dp, &lv = *(dp=new (buf) ::ccc::EE6x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x3E);
    dp->::ccc::EE6x3::~EE6x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x3E(Test__ZN3ccc5EE6x3E, "_ZN3ccc5EE6x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x3C1Ev();
extern void _ZN3ccc5EE6x3D1Ev();
Name_Map name_map__ZN3ccc5EE6x3E[] = {
  NSPAIR(_ZN3ccc5EE6x3C1Ev),
  NSPAIR(_ZN3ccc5EE6x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x3E[];
extern void _ZN3ccc5EE6x33abcEv();
extern void _ZN3ccc5EE6x33efgEv();
extern void _ZN3ccc5EE6x33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x3E[] = {
  {&(_ZTVN3ccc5EE6x3E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x3E[];
Class_Descriptor cd__ZN3ccc5EE6x3E = {  "_ZN3ccc5EE6x3E", // class name
  bases__ZN3ccc5EE6x3E, 1,
  &(vtc__ZN3ccc5EE6x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x3E),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
namespace ccc { 
struct  EE6x4  : virtual ::ccc::AA6 {
  virtual void  pqr(); // _ZN3ccc5EE6x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE6x43abcEv
  virtual void  efg(); // _ZN3ccc5EE6x43efgEv
  ~EE6x4(); // tgen
  EE6x4(); // tgen
};
//SIG(1 _ZN3ccc5EE6x4E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x43pqrEv");}
void  ccc::EE6x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x43abcEv");}
void  ccc::EE6x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x43efgEv");}
ccc::EE6x4 ::~EE6x4(){ note_dtor("_ZN3ccc5EE6x4E", this);} // tgen
ccc::EE6x4 ::EE6x4(){ note_ctor("_ZN3ccc5EE6x4E", this);} // tgen
}
static void Test__ZN3ccc5EE6x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x4E, buf);
    ::ccc::EE6x4 *dp, &lv = *(dp=new (buf) ::ccc::EE6x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x4E);
    dp->::ccc::EE6x4::~EE6x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x4E(Test__ZN3ccc5EE6x4E, "_ZN3ccc5EE6x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x4C1Ev();
extern void _ZN3ccc5EE6x4D1Ev();
Name_Map name_map__ZN3ccc5EE6x4E[] = {
  NSPAIR(_ZN3ccc5EE6x4C1Ev),
  NSPAIR(_ZN3ccc5EE6x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x4E[];
extern void _ZN3ccc5EE6x43abcEv();
extern void _ZN3ccc5EE6x43efgEv();
extern void _ZN3ccc5EE6x43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x4E[] = {
  {&(_ZTVN3ccc5EE6x4E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x4E[];
Class_Descriptor cd__ZN3ccc5EE6x4E = {  "_ZN3ccc5EE6x4E", // class name
  bases__ZN3ccc5EE6x4E, 1,
  &(vtc__ZN3ccc5EE6x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x4E),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
namespace ccc { 
struct  EE6x5  : virtual ::ccc::AA6 {
  virtual void  pqr(); // _ZN3ccc5EE6x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE6x53efgEv
  virtual void  abc(); // _ZN3ccc5EE6x53abcEv
  ~EE6x5(); // tgen
  EE6x5(); // tgen
};
//SIG(1 _ZN3ccc5EE6x5E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE6x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x53pqrEv");}
void  ccc::EE6x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x53efgEv");}
void  ccc::EE6x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x53abcEv");}
ccc::EE6x5 ::~EE6x5(){ note_dtor("_ZN3ccc5EE6x5E", this);} // tgen
ccc::EE6x5 ::EE6x5(){ note_ctor("_ZN3ccc5EE6x5E", this);} // tgen
}
static void Test__ZN3ccc5EE6x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x5E, buf);
    ::ccc::EE6x5 *dp, &lv = *(dp=new (buf) ::ccc::EE6x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x5E);
    dp->::ccc::EE6x5::~EE6x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x5E(Test__ZN3ccc5EE6x5E, "_ZN3ccc5EE6x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x5C1Ev();
extern void _ZN3ccc5EE6x5D1Ev();
Name_Map name_map__ZN3ccc5EE6x5E[] = {
  NSPAIR(_ZN3ccc5EE6x5C1Ev),
  NSPAIR(_ZN3ccc5EE6x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x5E[];
extern void _ZN3ccc5EE6x53abcEv();
extern void _ZN3ccc5EE6x53efgEv();
extern void _ZN3ccc5EE6x53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x5E[] = {
  {&(_ZTVN3ccc5EE6x5E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x5E[];
Class_Descriptor cd__ZN3ccc5EE6x5E = {  "_ZN3ccc5EE6x5E", // class name
  bases__ZN3ccc5EE6x5E, 1,
  &(vtc__ZN3ccc5EE6x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x5E),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
namespace ccc { 
struct  EE6x6  : virtual ::ccc::AA6 {
  virtual void  abc(); // _ZN3ccc5EE6x63abcEv
  virtual void  efg(); // _ZN3ccc5EE6x63efgEv
  ~EE6x6(); // tgen
  EE6x6(); // tgen
};
//SIG(1 _ZN3ccc5EE6x6E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE6x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x63abcEv");}
void  ccc::EE6x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x63efgEv");}
ccc::EE6x6 ::~EE6x6(){ note_dtor("_ZN3ccc5EE6x6E", this);} // tgen
ccc::EE6x6 ::EE6x6(){ note_ctor("_ZN3ccc5EE6x6E", this);} // tgen
}
static void Test__ZN3ccc5EE6x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x6E, buf);
    ::ccc::EE6x6 *dp, &lv = *(dp=new (buf) ::ccc::EE6x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x6E);
    dp->::ccc::EE6x6::~EE6x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x6E(Test__ZN3ccc5EE6x6E, "_ZN3ccc5EE6x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x6C1Ev();
extern void _ZN3ccc5EE6x6D1Ev();
Name_Map name_map__ZN3ccc5EE6x6E[] = {
  NSPAIR(_ZN3ccc5EE6x6C1Ev),
  NSPAIR(_ZN3ccc5EE6x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x6E[];
extern void _ZN3ccc5EE6x63abcEv();
extern void _ZN3ccc5EE6x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x6E[] = {
  {&(_ZTVN3ccc5EE6x6E[5]),  5,7},
  {&(_ZTVN3ccc5EE6x6E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x6E[];
Class_Descriptor cd__ZN3ccc5EE6x6E = {  "_ZN3ccc5EE6x6E", // class name
  bases__ZN3ccc5EE6x6E, 1,
  &(vtc__ZN3ccc5EE6x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x6E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x6E),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
namespace ccc { 
struct  EE6x7  : virtual ::ccc::AA6 {
  virtual void  abc(); // _ZN3ccc5EE6x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE6x73pqrEv
  ~EE6x7(); // tgen
  EE6x7(); // tgen
};
//SIG(1 _ZN3ccc5EE6x7E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE6x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x73abcEv");}
void  ccc::EE6x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x73pqrEv");}
ccc::EE6x7 ::~EE6x7(){ note_dtor("_ZN3ccc5EE6x7E", this);} // tgen
ccc::EE6x7 ::EE6x7(){ note_ctor("_ZN3ccc5EE6x7E", this);} // tgen
}
static void Test__ZN3ccc5EE6x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x7E, buf);
    ::ccc::EE6x7 *dp, &lv = *(dp=new (buf) ::ccc::EE6x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x7E);
    dp->::ccc::EE6x7::~EE6x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x7E(Test__ZN3ccc5EE6x7E, "_ZN3ccc5EE6x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x7C1Ev();
extern void _ZN3ccc5EE6x7D1Ev();
Name_Map name_map__ZN3ccc5EE6x7E[] = {
  NSPAIR(_ZN3ccc5EE6x7C1Ev),
  NSPAIR(_ZN3ccc5EE6x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x7E[];
extern void _ZN3ccc5EE6x73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc5EE6x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x7E[] = {
  {&(_ZTVN3ccc5EE6x7E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x7E[];
Class_Descriptor cd__ZN3ccc5EE6x7E = {  "_ZN3ccc5EE6x7E", // class name
  bases__ZN3ccc5EE6x7E, 1,
  &(vtc__ZN3ccc5EE6x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x7E),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
namespace ccc { 
struct  EE6x8  : virtual ::ccc::AA6 {
  virtual void  efg(); // _ZN3ccc5EE6x83efgEv
  virtual void  abc(); // _ZN3ccc5EE6x83abcEv
  ~EE6x8(); // tgen
  EE6x8(); // tgen
};
//SIG(1 _ZN3ccc5EE6x8E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE6x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x83efgEv");}
void  ccc::EE6x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE6x83abcEv");}
ccc::EE6x8 ::~EE6x8(){ note_dtor("_ZN3ccc5EE6x8E", this);} // tgen
ccc::EE6x8 ::EE6x8(){ note_ctor("_ZN3ccc5EE6x8E", this);} // tgen
}
static void Test__ZN3ccc5EE6x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x8E, buf);
    ::ccc::EE6x8 *dp, &lv = *(dp=new (buf) ::ccc::EE6x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x8E);
    dp->::ccc::EE6x8::~EE6x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x8E(Test__ZN3ccc5EE6x8E, "_ZN3ccc5EE6x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x8C1Ev();
extern void _ZN3ccc5EE6x8D1Ev();
Name_Map name_map__ZN3ccc5EE6x8E[] = {
  NSPAIR(_ZN3ccc5EE6x8C1Ev),
  NSPAIR(_ZN3ccc5EE6x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x8E[];
extern void _ZN3ccc5EE6x83abcEv();
extern void _ZN3ccc5EE6x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE6x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x8E[] = {
  {&(_ZTVN3ccc5EE6x8E[5]),  5,7},
  {&(_ZTVN3ccc5EE6x8E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x8E[];
Class_Descriptor cd__ZN3ccc5EE6x8E = {  "_ZN3ccc5EE6x8E", // class name
  bases__ZN3ccc5EE6x8E, 1,
  &(vtc__ZN3ccc5EE6x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x8E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x8E),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
namespace ccc { 
struct  EE6x9  : virtual ::ccc::AA6 {
  virtual void  efg(); // _ZN3ccc5EE6x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE6x93pqrEv
  ~EE6x9(); // tgen
  EE6x9(); // tgen
};
//SIG(1 _ZN3ccc5EE6x9E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE6x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE6x93efgEv");}
void  ccc::EE6x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE6x93pqrEv");}
ccc::EE6x9 ::~EE6x9(){ note_dtor("_ZN3ccc5EE6x9E", this);} // tgen
ccc::EE6x9 ::EE6x9(){ note_ctor("_ZN3ccc5EE6x9E", this);} // tgen
}
static void Test__ZN3ccc5EE6x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE6x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE6x9E, buf);
    ::ccc::EE6x9 *dp, &lv = *(dp=new (buf) ::ccc::EE6x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE6x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE6x9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc5EE6x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE6x9E);
    dp->::ccc::EE6x9::~EE6x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE6x9E(Test__ZN3ccc5EE6x9E, "_ZN3ccc5EE6x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE6x9C1Ev();
extern void _ZN3ccc5EE6x9D1Ev();
Name_Map name_map__ZN3ccc5EE6x9E[] = {
  NSPAIR(_ZN3ccc5EE6x9C1Ev),
  NSPAIR(_ZN3ccc5EE6x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc5EE6x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE6x9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc5EE6x93efgEv();
extern void _ZN3ccc5EE6x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE6x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE6x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE6x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE6x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE6x9E[] = {
  {&(_ZTVN3ccc5EE6x9E[5]),  5,8},
  {&(_ZTVN3ccc5EE6x9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE6x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE6x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE6x9E[];
Class_Descriptor cd__ZN3ccc5EE6x9E = {  "_ZN3ccc5EE6x9E", // class name
  bases__ZN3ccc5EE6x9E, 1,
  &(vtc__ZN3ccc5EE6x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE6x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE6x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE6x9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE6x9E),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
namespace ccc { 
struct  EE6x10  : virtual ::ccc::AA6 {
  virtual void  pqr(); // _ZN3ccc6EE6x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE6x103abcEv
  ~EE6x10(); // tgen
  EE6x10(); // tgen
};
//SIG(1 _ZN3ccc6EE6x10E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE6x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE6x103pqrEv");}
void  ccc::EE6x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE6x103abcEv");}
ccc::EE6x10 ::~EE6x10(){ note_dtor("_ZN3ccc6EE6x10E", this);} // tgen
ccc::EE6x10 ::EE6x10(){ note_ctor("_ZN3ccc6EE6x10E", this);} // tgen
}
static void Test__ZN3ccc6EE6x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x10E, buf);
    ::ccc::EE6x10 *dp, &lv = *(dp=new (buf) ::ccc::EE6x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x10E);
    dp->::ccc::EE6x10::~EE6x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x10E(Test__ZN3ccc6EE6x10E, "_ZN3ccc6EE6x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x10C1Ev();
extern void _ZN3ccc6EE6x10D1Ev();
Name_Map name_map__ZN3ccc6EE6x10E[] = {
  NSPAIR(_ZN3ccc6EE6x10C1Ev),
  NSPAIR(_ZN3ccc6EE6x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x10E[];
extern void _ZN3ccc6EE6x103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc6EE6x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE6x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE6x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x10E[] = {
  {&(_ZTVN3ccc6EE6x10E[5]),  5,8},
  {&(_ZTVN3ccc6EE6x10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x10E[];
Class_Descriptor cd__ZN3ccc6EE6x10E = {  "_ZN3ccc6EE6x10E", // class name
  bases__ZN3ccc6EE6x10E, 1,
  &(vtc__ZN3ccc6EE6x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x10E),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
namespace ccc { 
struct  EE6x11  : virtual ::ccc::AA6 {
  virtual void  pqr(); // _ZN3ccc6EE6x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE6x113efgEv
  ~EE6x11(); // tgen
  EE6x11(); // tgen
};
//SIG(1 _ZN3ccc6EE6x11E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE6x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE6x113pqrEv");}
void  ccc::EE6x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE6x113efgEv");}
ccc::EE6x11 ::~EE6x11(){ note_dtor("_ZN3ccc6EE6x11E", this);} // tgen
ccc::EE6x11 ::EE6x11(){ note_ctor("_ZN3ccc6EE6x11E", this);} // tgen
}
static void Test__ZN3ccc6EE6x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x11E, buf);
    ::ccc::EE6x11 *dp, &lv = *(dp=new (buf) ::ccc::EE6x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x11E);
    dp->::ccc::EE6x11::~EE6x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x11E(Test__ZN3ccc6EE6x11E, "_ZN3ccc6EE6x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x11C1Ev();
extern void _ZN3ccc6EE6x11D1Ev();
Name_Map name_map__ZN3ccc6EE6x11E[] = {
  NSPAIR(_ZN3ccc6EE6x11C1Ev),
  NSPAIR(_ZN3ccc6EE6x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc6EE6x113efgEv();
extern void _ZN3ccc6EE6x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE6x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE6x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x11E[] = {
  {&(_ZTVN3ccc6EE6x11E[5]),  5,8},
  {&(_ZTVN3ccc6EE6x11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x11E[];
Class_Descriptor cd__ZN3ccc6EE6x11E = {  "_ZN3ccc6EE6x11E", // class name
  bases__ZN3ccc6EE6x11E, 1,
  &(vtc__ZN3ccc6EE6x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x11E),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
namespace ccc { 
struct  EE6x12  : virtual ::ccc::AA6 {
  virtual void  abc(); // _ZN3ccc6EE6x123abcEv
  ~EE6x12(); // tgen
  EE6x12(); // tgen
};
//SIG(1 _ZN3ccc6EE6x12E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE6x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE6x123abcEv");}
ccc::EE6x12 ::~EE6x12(){ note_dtor("_ZN3ccc6EE6x12E", this);} // tgen
ccc::EE6x12 ::EE6x12(){ note_ctor("_ZN3ccc6EE6x12E", this);} // tgen
}
static void Test__ZN3ccc6EE6x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x12E, buf);
    ::ccc::EE6x12 *dp, &lv = *(dp=new (buf) ::ccc::EE6x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x12E);
    dp->::ccc::EE6x12::~EE6x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x12E(Test__ZN3ccc6EE6x12E, "_ZN3ccc6EE6x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x12C1Ev();
extern void _ZN3ccc6EE6x12D1Ev();
Name_Map name_map__ZN3ccc6EE6x12E[] = {
  NSPAIR(_ZN3ccc6EE6x12C1Ev),
  NSPAIR(_ZN3ccc6EE6x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x12E[];
extern void _ZN3ccc6EE6x123abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE6x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x12E[] = {
  {&(_ZTVN3ccc6EE6x12E[5]),  5,7},
  {&(_ZTVN3ccc6EE6x12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x12E[];
Class_Descriptor cd__ZN3ccc6EE6x12E = {  "_ZN3ccc6EE6x12E", // class name
  bases__ZN3ccc6EE6x12E, 1,
  &(vtc__ZN3ccc6EE6x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x12E),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
namespace ccc { 
struct  EE6x13  : virtual ::ccc::AA6 {
  virtual void  efg(); // _ZN3ccc6EE6x133efgEv
  ~EE6x13(); // tgen
  EE6x13(); // tgen
};
//SIG(1 _ZN3ccc6EE6x13E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE6x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE6x133efgEv");}
ccc::EE6x13 ::~EE6x13(){ note_dtor("_ZN3ccc6EE6x13E", this);} // tgen
ccc::EE6x13 ::EE6x13(){ note_ctor("_ZN3ccc6EE6x13E", this);} // tgen
}
static void Test__ZN3ccc6EE6x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x13E, buf);
    ::ccc::EE6x13 *dp, &lv = *(dp=new (buf) ::ccc::EE6x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x13E);
    dp->::ccc::EE6x13::~EE6x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x13E(Test__ZN3ccc6EE6x13E, "_ZN3ccc6EE6x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x13C1Ev();
extern void _ZN3ccc6EE6x13D1Ev();
Name_Map name_map__ZN3ccc6EE6x13E[] = {
  NSPAIR(_ZN3ccc6EE6x13C1Ev),
  NSPAIR(_ZN3ccc6EE6x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc6EE6x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE6x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x13E[] = {
  {&(_ZTVN3ccc6EE6x13E[5]),  5,7},
  {&(_ZTVN3ccc6EE6x13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x13E[];
Class_Descriptor cd__ZN3ccc6EE6x13E = {  "_ZN3ccc6EE6x13E", // class name
  bases__ZN3ccc6EE6x13E, 1,
  &(vtc__ZN3ccc6EE6x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x13E),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
namespace ccc { 
struct  EE6x14  : virtual ::ccc::AA6 {
  virtual void  pqr(); // _ZN3ccc6EE6x143pqrEv
  ~EE6x14(); // tgen
  EE6x14(); // tgen
};
//SIG(1 _ZN3ccc6EE6x14E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE6x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE6x143pqrEv");}
ccc::EE6x14 ::~EE6x14(){ note_dtor("_ZN3ccc6EE6x14E", this);} // tgen
ccc::EE6x14 ::EE6x14(){ note_ctor("_ZN3ccc6EE6x14E", this);} // tgen
}
static void Test__ZN3ccc6EE6x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x14E, buf);
    ::ccc::EE6x14 *dp, &lv = *(dp=new (buf) ::ccc::EE6x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x14E);
    dp->::ccc::EE6x14::~EE6x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x14E(Test__ZN3ccc6EE6x14E, "_ZN3ccc6EE6x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x14C1Ev();
extern void _ZN3ccc6EE6x14D1Ev();
Name_Map name_map__ZN3ccc6EE6x14E[] = {
  NSPAIR(_ZN3ccc6EE6x14C1Ev),
  NSPAIR(_ZN3ccc6EE6x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc6EE6x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE6x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x14E[] = {
  {&(_ZTVN3ccc6EE6x14E[5]),  5,8},
  {&(_ZTVN3ccc6EE6x14E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x14E[];
Class_Descriptor cd__ZN3ccc6EE6x14E = {  "_ZN3ccc6EE6x14E", // class name
  bases__ZN3ccc6EE6x14E, 1,
  &(vtc__ZN3ccc6EE6x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x14E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x14E),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
namespace ccc { 
struct  EE6x15  : virtual ::ccc::AA6 {
  ~EE6x15(); // tgen
  EE6x15(); // tgen
};
//SIG(1 _ZN3ccc6EE6x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE6x15 ::~EE6x15(){ note_dtor("_ZN3ccc6EE6x15E", this);} // tgen
ccc::EE6x15 ::EE6x15(){ note_ctor("_ZN3ccc6EE6x15E", this);} // tgen
}
static void Test__ZN3ccc6EE6x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE6x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE6x15E, buf);
    ::ccc::EE6x15 *dp, &lv = *(dp=new (buf) ::ccc::EE6x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE6x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE6x15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc6EE6x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE6x15E);
    dp->::ccc::EE6x15::~EE6x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE6x15E(Test__ZN3ccc6EE6x15E, "_ZN3ccc6EE6x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE6x15C1Ev();
extern void _ZN3ccc6EE6x15D1Ev();
Name_Map name_map__ZN3ccc6EE6x15E[] = {
  NSPAIR(_ZN3ccc6EE6x15C1Ev),
  NSPAIR(_ZN3ccc6EE6x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
static Base_Class bases__ZN3ccc6EE6x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE6x15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE6x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE6x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE6x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE6x15E[] = {
  {&(_ZTVN3ccc6EE6x15E[5]),  5,7},
  {&(_ZTVN3ccc6EE6x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE6x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE6x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE6x15E[];
Class_Descriptor cd__ZN3ccc6EE6x15E = {  "_ZN3ccc6EE6x15E", // class name
  bases__ZN3ccc6EE6x15E, 1,
  &(vtc__ZN3ccc6EE6x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE6x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE6x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE6x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE6x15E),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
namespace ccc { 
struct  AA7  {
  virtual void  abc(); // _ZN3ccc3AA73abcEv
  virtual void  pqr(); // _ZN3ccc3AA73pqrEv
  ~AA7(); // tgen
  AA7(); // tgen
};
//SIG(-1 _ZN3ccc3AA7E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA7 ::abc(){vfunc_called(this, "_ZN3ccc3AA73abcEv");}
void  ccc::AA7 ::pqr(){vfunc_called(this, "_ZN3ccc3AA73pqrEv");}
ccc::AA7 ::~AA7(){ note_dtor("_ZN3ccc3AA7E", this);} // tgen
ccc::AA7 ::AA7(){ note_ctor("_ZN3ccc3AA7E", this);} // tgen
}
static void Test__ZN3ccc3AA7E()
{
  extern Class_Descriptor cd__ZN3ccc3AA7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA7E, buf);
    ::ccc::AA7 *dp, &lv = *(dp=new (buf) ::ccc::AA7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA7E)");
    test_class_info(&lv, &cd__ZN3ccc3AA7E);
    dp->::ccc::AA7::~AA7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA7E(Test__ZN3ccc3AA7E, "_ZN3ccc3AA7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA7C1Ev();
extern void _ZN3ccc3AA7D1Ev();
Name_Map name_map__ZN3ccc3AA7E[] = {
  NSPAIR(_ZN3ccc3AA7C1Ev),
  NSPAIR(_ZN3ccc3AA7D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
Class_Descriptor cd__ZN3ccc3AA7E = {  "_ZN3ccc3AA7E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA7E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA7E),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
namespace ccc { 
struct  BB7  {
  virtual void  abc(); // _ZN3ccc3BB73abcEv
  virtual void  pqr(); // _ZN3ccc3BB73pqrEv
  ~BB7(); // tgen
  BB7(); // tgen
};
//SIG(1 _ZN3ccc3BB7E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB7 ::abc(){vfunc_called(this, "_ZN3ccc3BB73abcEv");}
void  ccc::BB7 ::pqr(){vfunc_called(this, "_ZN3ccc3BB73pqrEv");}
ccc::BB7 ::~BB7(){ note_dtor("_ZN3ccc3BB7E", this);} // tgen
ccc::BB7 ::BB7(){ note_ctor("_ZN3ccc3BB7E", this);} // tgen
}
static void Test__ZN3ccc3BB7E()
{
  extern Class_Descriptor cd__ZN3ccc3BB7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB7E, buf);
    ::ccc::BB7 *dp, &lv = *(dp=new (buf) ::ccc::BB7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB7E)");
    test_class_info(&lv, &cd__ZN3ccc3BB7E);
    dp->::ccc::BB7::~BB7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB7E(Test__ZN3ccc3BB7E, "_ZN3ccc3BB7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB7C1Ev();
extern void _ZN3ccc3BB7D1Ev();
Name_Map name_map__ZN3ccc3BB7E[] = {
  NSPAIR(_ZN3ccc3BB7C1Ev),
  NSPAIR(_ZN3ccc3BB7D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
Class_Descriptor cd__ZN3ccc3BB7E = {  "_ZN3ccc3BB7E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB7E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB7E),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
namespace ccc { 
struct  EE7x0  : virtual ::ccc::AA7 {
  virtual void  abc(); // _ZN3ccc5EE7x03abcEv
  virtual void  efg(); // _ZN3ccc5EE7x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE7x03pqrEv
  ~EE7x0(); // tgen
  EE7x0(); // tgen
};
//SIG(1 _ZN3ccc5EE7x0E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x03abcEv");}
void  ccc::EE7x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x03efgEv");}
void  ccc::EE7x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x03pqrEv");}
ccc::EE7x0 ::~EE7x0(){ note_dtor("_ZN3ccc5EE7x0E", this);} // tgen
ccc::EE7x0 ::EE7x0(){ note_ctor("_ZN3ccc5EE7x0E", this);} // tgen
}
static void Test__ZN3ccc5EE7x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x0E, buf);
    ::ccc::EE7x0 *dp, &lv = *(dp=new (buf) ::ccc::EE7x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x0E);
    dp->::ccc::EE7x0::~EE7x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x0E(Test__ZN3ccc5EE7x0E, "_ZN3ccc5EE7x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x0C1Ev();
extern void _ZN3ccc5EE7x0D1Ev();
Name_Map name_map__ZN3ccc5EE7x0E[] = {
  NSPAIR(_ZN3ccc5EE7x0C1Ev),
  NSPAIR(_ZN3ccc5EE7x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x0E[];
extern void _ZN3ccc5EE7x03abcEv();
extern void _ZN3ccc5EE7x03pqrEv();
extern void _ZN3ccc5EE7x03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x0E[] = {
  {&(_ZTVN3ccc5EE7x0E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x0E[];
Class_Descriptor cd__ZN3ccc5EE7x0E = {  "_ZN3ccc5EE7x0E", // class name
  bases__ZN3ccc5EE7x0E, 1,
  &(vtc__ZN3ccc5EE7x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x0E),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
namespace ccc { 
struct  EE7x1  : virtual ::ccc::AA7 {
  virtual void  abc(); // _ZN3ccc5EE7x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE7x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE7x13efgEv
  ~EE7x1(); // tgen
  EE7x1(); // tgen
};
//SIG(1 _ZN3ccc5EE7x1E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x13abcEv");}
void  ccc::EE7x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x13pqrEv");}
void  ccc::EE7x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x13efgEv");}
ccc::EE7x1 ::~EE7x1(){ note_dtor("_ZN3ccc5EE7x1E", this);} // tgen
ccc::EE7x1 ::EE7x1(){ note_ctor("_ZN3ccc5EE7x1E", this);} // tgen
}
static void Test__ZN3ccc5EE7x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x1E, buf);
    ::ccc::EE7x1 *dp, &lv = *(dp=new (buf) ::ccc::EE7x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x1E);
    dp->::ccc::EE7x1::~EE7x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x1E(Test__ZN3ccc5EE7x1E, "_ZN3ccc5EE7x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x1C1Ev();
extern void _ZN3ccc5EE7x1D1Ev();
Name_Map name_map__ZN3ccc5EE7x1E[] = {
  NSPAIR(_ZN3ccc5EE7x1C1Ev),
  NSPAIR(_ZN3ccc5EE7x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x1E[];
extern void _ZN3ccc5EE7x13abcEv();
extern void _ZN3ccc5EE7x13pqrEv();
extern void _ZN3ccc5EE7x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x1E[] = {
  {&(_ZTVN3ccc5EE7x1E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x1E[];
Class_Descriptor cd__ZN3ccc5EE7x1E = {  "_ZN3ccc5EE7x1E", // class name
  bases__ZN3ccc5EE7x1E, 1,
  &(vtc__ZN3ccc5EE7x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x1E),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
namespace ccc { 
struct  EE7x2  : virtual ::ccc::AA7 {
  virtual void  efg(); // _ZN3ccc5EE7x23efgEv
  virtual void  abc(); // _ZN3ccc5EE7x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE7x23pqrEv
  ~EE7x2(); // tgen
  EE7x2(); // tgen
};
//SIG(1 _ZN3ccc5EE7x2E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x23efgEv");}
void  ccc::EE7x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x23abcEv");}
void  ccc::EE7x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x23pqrEv");}
ccc::EE7x2 ::~EE7x2(){ note_dtor("_ZN3ccc5EE7x2E", this);} // tgen
ccc::EE7x2 ::EE7x2(){ note_ctor("_ZN3ccc5EE7x2E", this);} // tgen
}
static void Test__ZN3ccc5EE7x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x2E, buf);
    ::ccc::EE7x2 *dp, &lv = *(dp=new (buf) ::ccc::EE7x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x2E);
    dp->::ccc::EE7x2::~EE7x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x2E(Test__ZN3ccc5EE7x2E, "_ZN3ccc5EE7x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x2C1Ev();
extern void _ZN3ccc5EE7x2D1Ev();
Name_Map name_map__ZN3ccc5EE7x2E[] = {
  NSPAIR(_ZN3ccc5EE7x2C1Ev),
  NSPAIR(_ZN3ccc5EE7x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x2E[];
extern void _ZN3ccc5EE7x23abcEv();
extern void _ZN3ccc5EE7x23pqrEv();
extern void _ZN3ccc5EE7x23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x2E[] = {
  {&(_ZTVN3ccc5EE7x2E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x2E[];
Class_Descriptor cd__ZN3ccc5EE7x2E = {  "_ZN3ccc5EE7x2E", // class name
  bases__ZN3ccc5EE7x2E, 1,
  &(vtc__ZN3ccc5EE7x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x2E),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
namespace ccc { 
struct  EE7x3  : virtual ::ccc::AA7 {
  virtual void  efg(); // _ZN3ccc5EE7x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE7x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE7x33abcEv
  ~EE7x3(); // tgen
  EE7x3(); // tgen
};
//SIG(1 _ZN3ccc5EE7x3E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x33efgEv");}
void  ccc::EE7x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x33pqrEv");}
void  ccc::EE7x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x33abcEv");}
ccc::EE7x3 ::~EE7x3(){ note_dtor("_ZN3ccc5EE7x3E", this);} // tgen
ccc::EE7x3 ::EE7x3(){ note_ctor("_ZN3ccc5EE7x3E", this);} // tgen
}
static void Test__ZN3ccc5EE7x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x3E, buf);
    ::ccc::EE7x3 *dp, &lv = *(dp=new (buf) ::ccc::EE7x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x3E);
    dp->::ccc::EE7x3::~EE7x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x3E(Test__ZN3ccc5EE7x3E, "_ZN3ccc5EE7x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x3C1Ev();
extern void _ZN3ccc5EE7x3D1Ev();
Name_Map name_map__ZN3ccc5EE7x3E[] = {
  NSPAIR(_ZN3ccc5EE7x3C1Ev),
  NSPAIR(_ZN3ccc5EE7x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x3E[];
extern void _ZN3ccc5EE7x33abcEv();
extern void _ZN3ccc5EE7x33pqrEv();
extern void _ZN3ccc5EE7x33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x3E[] = {
  {&(_ZTVN3ccc5EE7x3E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x3E[];
Class_Descriptor cd__ZN3ccc5EE7x3E = {  "_ZN3ccc5EE7x3E", // class name
  bases__ZN3ccc5EE7x3E, 1,
  &(vtc__ZN3ccc5EE7x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x3E),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
namespace ccc { 
struct  EE7x4  : virtual ::ccc::AA7 {
  virtual void  pqr(); // _ZN3ccc5EE7x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE7x43abcEv
  virtual void  efg(); // _ZN3ccc5EE7x43efgEv
  ~EE7x4(); // tgen
  EE7x4(); // tgen
};
//SIG(1 _ZN3ccc5EE7x4E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x43pqrEv");}
void  ccc::EE7x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x43abcEv");}
void  ccc::EE7x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x43efgEv");}
ccc::EE7x4 ::~EE7x4(){ note_dtor("_ZN3ccc5EE7x4E", this);} // tgen
ccc::EE7x4 ::EE7x4(){ note_ctor("_ZN3ccc5EE7x4E", this);} // tgen
}
static void Test__ZN3ccc5EE7x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x4E, buf);
    ::ccc::EE7x4 *dp, &lv = *(dp=new (buf) ::ccc::EE7x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x4E);
    dp->::ccc::EE7x4::~EE7x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x4E(Test__ZN3ccc5EE7x4E, "_ZN3ccc5EE7x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x4C1Ev();
extern void _ZN3ccc5EE7x4D1Ev();
Name_Map name_map__ZN3ccc5EE7x4E[] = {
  NSPAIR(_ZN3ccc5EE7x4C1Ev),
  NSPAIR(_ZN3ccc5EE7x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x4E[];
extern void _ZN3ccc5EE7x43abcEv();
extern void _ZN3ccc5EE7x43pqrEv();
extern void _ZN3ccc5EE7x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x4E[] = {
  {&(_ZTVN3ccc5EE7x4E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x4E[];
Class_Descriptor cd__ZN3ccc5EE7x4E = {  "_ZN3ccc5EE7x4E", // class name
  bases__ZN3ccc5EE7x4E, 1,
  &(vtc__ZN3ccc5EE7x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x4E),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
namespace ccc { 
struct  EE7x5  : virtual ::ccc::AA7 {
  virtual void  pqr(); // _ZN3ccc5EE7x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE7x53efgEv
  virtual void  abc(); // _ZN3ccc5EE7x53abcEv
  ~EE7x5(); // tgen
  EE7x5(); // tgen
};
//SIG(1 _ZN3ccc5EE7x5E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE7x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x53pqrEv");}
void  ccc::EE7x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x53efgEv");}
void  ccc::EE7x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x53abcEv");}
ccc::EE7x5 ::~EE7x5(){ note_dtor("_ZN3ccc5EE7x5E", this);} // tgen
ccc::EE7x5 ::EE7x5(){ note_ctor("_ZN3ccc5EE7x5E", this);} // tgen
}
static void Test__ZN3ccc5EE7x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x5E, buf);
    ::ccc::EE7x5 *dp, &lv = *(dp=new (buf) ::ccc::EE7x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x5E);
    dp->::ccc::EE7x5::~EE7x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x5E(Test__ZN3ccc5EE7x5E, "_ZN3ccc5EE7x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x5C1Ev();
extern void _ZN3ccc5EE7x5D1Ev();
Name_Map name_map__ZN3ccc5EE7x5E[] = {
  NSPAIR(_ZN3ccc5EE7x5C1Ev),
  NSPAIR(_ZN3ccc5EE7x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x5E[];
extern void _ZN3ccc5EE7x53abcEv();
extern void _ZN3ccc5EE7x53pqrEv();
extern void _ZN3ccc5EE7x53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x5E[] = {
  {&(_ZTVN3ccc5EE7x5E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x5E[];
Class_Descriptor cd__ZN3ccc5EE7x5E = {  "_ZN3ccc5EE7x5E", // class name
  bases__ZN3ccc5EE7x5E, 1,
  &(vtc__ZN3ccc5EE7x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x5E),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
namespace ccc { 
struct  EE7x6  : virtual ::ccc::AA7 {
  virtual void  abc(); // _ZN3ccc5EE7x63abcEv
  virtual void  efg(); // _ZN3ccc5EE7x63efgEv
  ~EE7x6(); // tgen
  EE7x6(); // tgen
};
//SIG(1 _ZN3ccc5EE7x6E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE7x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x63abcEv");}
void  ccc::EE7x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x63efgEv");}
ccc::EE7x6 ::~EE7x6(){ note_dtor("_ZN3ccc5EE7x6E", this);} // tgen
ccc::EE7x6 ::EE7x6(){ note_ctor("_ZN3ccc5EE7x6E", this);} // tgen
}
static void Test__ZN3ccc5EE7x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x6E, buf);
    ::ccc::EE7x6 *dp, &lv = *(dp=new (buf) ::ccc::EE7x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x6E);
    dp->::ccc::EE7x6::~EE7x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x6E(Test__ZN3ccc5EE7x6E, "_ZN3ccc5EE7x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x6C1Ev();
extern void _ZN3ccc5EE7x6D1Ev();
Name_Map name_map__ZN3ccc5EE7x6E[] = {
  NSPAIR(_ZN3ccc5EE7x6C1Ev),
  NSPAIR(_ZN3ccc5EE7x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x6E[];
extern void _ZN3ccc5EE7x63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc5EE7x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x6E[] = {
  {&(_ZTVN3ccc5EE7x6E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x6E[];
Class_Descriptor cd__ZN3ccc5EE7x6E = {  "_ZN3ccc5EE7x6E", // class name
  bases__ZN3ccc5EE7x6E, 1,
  &(vtc__ZN3ccc5EE7x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x6E),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
namespace ccc { 
struct  EE7x7  : virtual ::ccc::AA7 {
  virtual void  abc(); // _ZN3ccc5EE7x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE7x73pqrEv
  ~EE7x7(); // tgen
  EE7x7(); // tgen
};
//SIG(1 _ZN3ccc5EE7x7E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE7x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x73abcEv");}
void  ccc::EE7x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x73pqrEv");}
ccc::EE7x7 ::~EE7x7(){ note_dtor("_ZN3ccc5EE7x7E", this);} // tgen
ccc::EE7x7 ::EE7x7(){ note_ctor("_ZN3ccc5EE7x7E", this);} // tgen
}
static void Test__ZN3ccc5EE7x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x7E, buf);
    ::ccc::EE7x7 *dp, &lv = *(dp=new (buf) ::ccc::EE7x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x7E);
    dp->::ccc::EE7x7::~EE7x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x7E(Test__ZN3ccc5EE7x7E, "_ZN3ccc5EE7x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x7C1Ev();
extern void _ZN3ccc5EE7x7D1Ev();
Name_Map name_map__ZN3ccc5EE7x7E[] = {
  NSPAIR(_ZN3ccc5EE7x7C1Ev),
  NSPAIR(_ZN3ccc5EE7x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x7E[];
extern void _ZN3ccc5EE7x73abcEv();
extern void _ZN3ccc5EE7x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x7E[] = {
  {&(_ZTVN3ccc5EE7x7E[5]),  5,7},
  {&(_ZTVN3ccc5EE7x7E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x7E[];
Class_Descriptor cd__ZN3ccc5EE7x7E = {  "_ZN3ccc5EE7x7E", // class name
  bases__ZN3ccc5EE7x7E, 1,
  &(vtc__ZN3ccc5EE7x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x7E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x7E),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
namespace ccc { 
struct  EE7x8  : virtual ::ccc::AA7 {
  virtual void  efg(); // _ZN3ccc5EE7x83efgEv
  virtual void  abc(); // _ZN3ccc5EE7x83abcEv
  ~EE7x8(); // tgen
  EE7x8(); // tgen
};
//SIG(1 _ZN3ccc5EE7x8E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE7x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x83efgEv");}
void  ccc::EE7x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE7x83abcEv");}
ccc::EE7x8 ::~EE7x8(){ note_dtor("_ZN3ccc5EE7x8E", this);} // tgen
ccc::EE7x8 ::EE7x8(){ note_ctor("_ZN3ccc5EE7x8E", this);} // tgen
}
static void Test__ZN3ccc5EE7x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x8E, buf);
    ::ccc::EE7x8 *dp, &lv = *(dp=new (buf) ::ccc::EE7x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x8E);
    dp->::ccc::EE7x8::~EE7x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x8E(Test__ZN3ccc5EE7x8E, "_ZN3ccc5EE7x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x8C1Ev();
extern void _ZN3ccc5EE7x8D1Ev();
Name_Map name_map__ZN3ccc5EE7x8E[] = {
  NSPAIR(_ZN3ccc5EE7x8C1Ev),
  NSPAIR(_ZN3ccc5EE7x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x8E[];
extern void _ZN3ccc5EE7x83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc5EE7x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE7x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x8E[] = {
  {&(_ZTVN3ccc5EE7x8E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x8E[];
Class_Descriptor cd__ZN3ccc5EE7x8E = {  "_ZN3ccc5EE7x8E", // class name
  bases__ZN3ccc5EE7x8E, 1,
  &(vtc__ZN3ccc5EE7x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x8E),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
namespace ccc { 
struct  EE7x9  : virtual ::ccc::AA7 {
  virtual void  efg(); // _ZN3ccc5EE7x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE7x93pqrEv
  ~EE7x9(); // tgen
  EE7x9(); // tgen
};
//SIG(1 _ZN3ccc5EE7x9E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE7x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE7x93efgEv");}
void  ccc::EE7x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE7x93pqrEv");}
ccc::EE7x9 ::~EE7x9(){ note_dtor("_ZN3ccc5EE7x9E", this);} // tgen
ccc::EE7x9 ::EE7x9(){ note_ctor("_ZN3ccc5EE7x9E", this);} // tgen
}
static void Test__ZN3ccc5EE7x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE7x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE7x9E, buf);
    ::ccc::EE7x9 *dp, &lv = *(dp=new (buf) ::ccc::EE7x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE7x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE7x9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc5EE7x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE7x9E);
    dp->::ccc::EE7x9::~EE7x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE7x9E(Test__ZN3ccc5EE7x9E, "_ZN3ccc5EE7x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE7x9C1Ev();
extern void _ZN3ccc5EE7x9D1Ev();
Name_Map name_map__ZN3ccc5EE7x9E[] = {
  NSPAIR(_ZN3ccc5EE7x9C1Ev),
  NSPAIR(_ZN3ccc5EE7x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc5EE7x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE7x9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc5EE7x93pqrEv();
extern void _ZN3ccc5EE7x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE7x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE7x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE7x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE7x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE7x9E[] = {
  {&(_ZTVN3ccc5EE7x9E[5]),  5,8},
  {&(_ZTVN3ccc5EE7x9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE7x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE7x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE7x9E[];
Class_Descriptor cd__ZN3ccc5EE7x9E = {  "_ZN3ccc5EE7x9E", // class name
  bases__ZN3ccc5EE7x9E, 1,
  &(vtc__ZN3ccc5EE7x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE7x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE7x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE7x9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE7x9E),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
namespace ccc { 
struct  EE7x10  : virtual ::ccc::AA7 {
  virtual void  pqr(); // _ZN3ccc6EE7x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE7x103abcEv
  ~EE7x10(); // tgen
  EE7x10(); // tgen
};
//SIG(1 _ZN3ccc6EE7x10E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE7x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE7x103pqrEv");}
void  ccc::EE7x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE7x103abcEv");}
ccc::EE7x10 ::~EE7x10(){ note_dtor("_ZN3ccc6EE7x10E", this);} // tgen
ccc::EE7x10 ::EE7x10(){ note_ctor("_ZN3ccc6EE7x10E", this);} // tgen
}
static void Test__ZN3ccc6EE7x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x10E, buf);
    ::ccc::EE7x10 *dp, &lv = *(dp=new (buf) ::ccc::EE7x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x10E);
    dp->::ccc::EE7x10::~EE7x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x10E(Test__ZN3ccc6EE7x10E, "_ZN3ccc6EE7x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x10C1Ev();
extern void _ZN3ccc6EE7x10D1Ev();
Name_Map name_map__ZN3ccc6EE7x10E[] = {
  NSPAIR(_ZN3ccc6EE7x10C1Ev),
  NSPAIR(_ZN3ccc6EE7x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x10E[];
extern void _ZN3ccc6EE7x103abcEv();
extern void _ZN3ccc6EE7x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE7x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE7x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x10E[] = {
  {&(_ZTVN3ccc6EE7x10E[5]),  5,7},
  {&(_ZTVN3ccc6EE7x10E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x10E[];
Class_Descriptor cd__ZN3ccc6EE7x10E = {  "_ZN3ccc6EE7x10E", // class name
  bases__ZN3ccc6EE7x10E, 1,
  &(vtc__ZN3ccc6EE7x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x10E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x10E),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
namespace ccc { 
struct  EE7x11  : virtual ::ccc::AA7 {
  virtual void  pqr(); // _ZN3ccc6EE7x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE7x113efgEv
  ~EE7x11(); // tgen
  EE7x11(); // tgen
};
//SIG(1 _ZN3ccc6EE7x11E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE7x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE7x113pqrEv");}
void  ccc::EE7x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE7x113efgEv");}
ccc::EE7x11 ::~EE7x11(){ note_dtor("_ZN3ccc6EE7x11E", this);} // tgen
ccc::EE7x11 ::EE7x11(){ note_ctor("_ZN3ccc6EE7x11E", this);} // tgen
}
static void Test__ZN3ccc6EE7x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x11E, buf);
    ::ccc::EE7x11 *dp, &lv = *(dp=new (buf) ::ccc::EE7x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x11E);
    dp->::ccc::EE7x11::~EE7x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x11E(Test__ZN3ccc6EE7x11E, "_ZN3ccc6EE7x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x11C1Ev();
extern void _ZN3ccc6EE7x11D1Ev();
Name_Map name_map__ZN3ccc6EE7x11E[] = {
  NSPAIR(_ZN3ccc6EE7x11C1Ev),
  NSPAIR(_ZN3ccc6EE7x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc6EE7x113pqrEv();
extern void _ZN3ccc6EE7x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE7x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE7x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x11E[] = {
  {&(_ZTVN3ccc6EE7x11E[5]),  5,8},
  {&(_ZTVN3ccc6EE7x11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x11E[];
Class_Descriptor cd__ZN3ccc6EE7x11E = {  "_ZN3ccc6EE7x11E", // class name
  bases__ZN3ccc6EE7x11E, 1,
  &(vtc__ZN3ccc6EE7x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x11E),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
namespace ccc { 
struct  EE7x12  : virtual ::ccc::AA7 {
  virtual void  abc(); // _ZN3ccc6EE7x123abcEv
  ~EE7x12(); // tgen
  EE7x12(); // tgen
};
//SIG(1 _ZN3ccc6EE7x12E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE7x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE7x123abcEv");}
ccc::EE7x12 ::~EE7x12(){ note_dtor("_ZN3ccc6EE7x12E", this);} // tgen
ccc::EE7x12 ::EE7x12(){ note_ctor("_ZN3ccc6EE7x12E", this);} // tgen
}
static void Test__ZN3ccc6EE7x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x12E, buf);
    ::ccc::EE7x12 *dp, &lv = *(dp=new (buf) ::ccc::EE7x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x12E);
    dp->::ccc::EE7x12::~EE7x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x12E(Test__ZN3ccc6EE7x12E, "_ZN3ccc6EE7x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x12C1Ev();
extern void _ZN3ccc6EE7x12D1Ev();
Name_Map name_map__ZN3ccc6EE7x12E[] = {
  NSPAIR(_ZN3ccc6EE7x12C1Ev),
  NSPAIR(_ZN3ccc6EE7x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x12E[];
extern void _ZN3ccc6EE7x123abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE7x123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x12E[] = {
  {&(_ZTVN3ccc6EE7x12E[5]),  5,7},
  {&(_ZTVN3ccc6EE7x12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x12E[];
Class_Descriptor cd__ZN3ccc6EE7x12E = {  "_ZN3ccc6EE7x12E", // class name
  bases__ZN3ccc6EE7x12E, 1,
  &(vtc__ZN3ccc6EE7x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x12E),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
namespace ccc { 
struct  EE7x13  : virtual ::ccc::AA7 {
  virtual void  efg(); // _ZN3ccc6EE7x133efgEv
  ~EE7x13(); // tgen
  EE7x13(); // tgen
};
//SIG(1 _ZN3ccc6EE7x13E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE7x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE7x133efgEv");}
ccc::EE7x13 ::~EE7x13(){ note_dtor("_ZN3ccc6EE7x13E", this);} // tgen
ccc::EE7x13 ::EE7x13(){ note_ctor("_ZN3ccc6EE7x13E", this);} // tgen
}
static void Test__ZN3ccc6EE7x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x13E, buf);
    ::ccc::EE7x13 *dp, &lv = *(dp=new (buf) ::ccc::EE7x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x13E);
    dp->::ccc::EE7x13::~EE7x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x13E(Test__ZN3ccc6EE7x13E, "_ZN3ccc6EE7x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x13C1Ev();
extern void _ZN3ccc6EE7x13D1Ev();
Name_Map name_map__ZN3ccc6EE7x13E[] = {
  NSPAIR(_ZN3ccc6EE7x13C1Ev),
  NSPAIR(_ZN3ccc6EE7x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc6EE7x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE7x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x13E[] = {
  {&(_ZTVN3ccc6EE7x13E[5]),  5,8},
  {&(_ZTVN3ccc6EE7x13E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x13E[];
Class_Descriptor cd__ZN3ccc6EE7x13E = {  "_ZN3ccc6EE7x13E", // class name
  bases__ZN3ccc6EE7x13E, 1,
  &(vtc__ZN3ccc6EE7x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x13E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x13E),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
namespace ccc { 
struct  EE7x14  : virtual ::ccc::AA7 {
  virtual void  pqr(); // _ZN3ccc6EE7x143pqrEv
  ~EE7x14(); // tgen
  EE7x14(); // tgen
};
//SIG(1 _ZN3ccc6EE7x14E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE7x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE7x143pqrEv");}
ccc::EE7x14 ::~EE7x14(){ note_dtor("_ZN3ccc6EE7x14E", this);} // tgen
ccc::EE7x14 ::EE7x14(){ note_ctor("_ZN3ccc6EE7x14E", this);} // tgen
}
static void Test__ZN3ccc6EE7x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x14E, buf);
    ::ccc::EE7x14 *dp, &lv = *(dp=new (buf) ::ccc::EE7x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x14E);
    dp->::ccc::EE7x14::~EE7x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x14E(Test__ZN3ccc6EE7x14E, "_ZN3ccc6EE7x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x14C1Ev();
extern void _ZN3ccc6EE7x14D1Ev();
Name_Map name_map__ZN3ccc6EE7x14E[] = {
  NSPAIR(_ZN3ccc6EE7x14C1Ev),
  NSPAIR(_ZN3ccc6EE7x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc6EE7x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE7x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x14E[] = {
  {&(_ZTVN3ccc6EE7x14E[5]),  5,7},
  {&(_ZTVN3ccc6EE7x14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x14E[];
Class_Descriptor cd__ZN3ccc6EE7x14E = {  "_ZN3ccc6EE7x14E", // class name
  bases__ZN3ccc6EE7x14E, 1,
  &(vtc__ZN3ccc6EE7x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x14E),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
namespace ccc { 
struct  EE7x15  : virtual ::ccc::AA7 {
  ~EE7x15(); // tgen
  EE7x15(); // tgen
};
//SIG(1 _ZN3ccc6EE7x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE7x15 ::~EE7x15(){ note_dtor("_ZN3ccc6EE7x15E", this);} // tgen
ccc::EE7x15 ::EE7x15(){ note_ctor("_ZN3ccc6EE7x15E", this);} // tgen
}
static void Test__ZN3ccc6EE7x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE7x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE7x15E, buf);
    ::ccc::EE7x15 *dp, &lv = *(dp=new (buf) ::ccc::EE7x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE7x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE7x15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc6EE7x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE7x15E);
    dp->::ccc::EE7x15::~EE7x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE7x15E(Test__ZN3ccc6EE7x15E, "_ZN3ccc6EE7x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE7x15C1Ev();
extern void _ZN3ccc6EE7x15D1Ev();
Name_Map name_map__ZN3ccc6EE7x15E[] = {
  NSPAIR(_ZN3ccc6EE7x15C1Ev),
  NSPAIR(_ZN3ccc6EE7x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
static Base_Class bases__ZN3ccc6EE7x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE7x15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE7x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE7x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE7x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE7x15E[] = {
  {&(_ZTVN3ccc6EE7x15E[5]),  5,7},
  {&(_ZTVN3ccc6EE7x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE7x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE7x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE7x15E[];
Class_Descriptor cd__ZN3ccc6EE7x15E = {  "_ZN3ccc6EE7x15E", // class name
  bases__ZN3ccc6EE7x15E, 1,
  &(vtc__ZN3ccc6EE7x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE7x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE7x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE7x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE7x15E),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
namespace ccc { 
struct  AA8  {
  virtual void  efg(); // _ZN3ccc3AA83efgEv
  virtual void  abc(); // _ZN3ccc3AA83abcEv
  ~AA8(); // tgen
  AA8(); // tgen
};
//SIG(-1 _ZN3ccc3AA8E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA8 ::efg(){vfunc_called(this, "_ZN3ccc3AA83efgEv");}
void  ccc::AA8 ::abc(){vfunc_called(this, "_ZN3ccc3AA83abcEv");}
ccc::AA8 ::~AA8(){ note_dtor("_ZN3ccc3AA8E", this);} // tgen
ccc::AA8 ::AA8(){ note_ctor("_ZN3ccc3AA8E", this);} // tgen
}
static void Test__ZN3ccc3AA8E()
{
  extern Class_Descriptor cd__ZN3ccc3AA8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA8E, buf);
    ::ccc::AA8 *dp, &lv = *(dp=new (buf) ::ccc::AA8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA8E)");
    test_class_info(&lv, &cd__ZN3ccc3AA8E);
    dp->::ccc::AA8::~AA8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA8E(Test__ZN3ccc3AA8E, "_ZN3ccc3AA8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA8C1Ev();
extern void _ZN3ccc3AA8D1Ev();
Name_Map name_map__ZN3ccc3AA8E[] = {
  NSPAIR(_ZN3ccc3AA8C1Ev),
  NSPAIR(_ZN3ccc3AA8D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
Class_Descriptor cd__ZN3ccc3AA8E = {  "_ZN3ccc3AA8E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA8E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA8E),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
namespace ccc { 
struct  BB8  {
  virtual void  efg(); // _ZN3ccc3BB83efgEv
  virtual void  abc(); // _ZN3ccc3BB83abcEv
  ~BB8(); // tgen
  BB8(); // tgen
};
//SIG(1 _ZN3ccc3BB8E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB8 ::efg(){vfunc_called(this, "_ZN3ccc3BB83efgEv");}
void  ccc::BB8 ::abc(){vfunc_called(this, "_ZN3ccc3BB83abcEv");}
ccc::BB8 ::~BB8(){ note_dtor("_ZN3ccc3BB8E", this);} // tgen
ccc::BB8 ::BB8(){ note_ctor("_ZN3ccc3BB8E", this);} // tgen
}
static void Test__ZN3ccc3BB8E()
{
  extern Class_Descriptor cd__ZN3ccc3BB8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB8E, buf);
    ::ccc::BB8 *dp, &lv = *(dp=new (buf) ::ccc::BB8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB8E)");
    test_class_info(&lv, &cd__ZN3ccc3BB8E);
    dp->::ccc::BB8::~BB8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB8E(Test__ZN3ccc3BB8E, "_ZN3ccc3BB8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB8C1Ev();
extern void _ZN3ccc3BB8D1Ev();
Name_Map name_map__ZN3ccc3BB8E[] = {
  NSPAIR(_ZN3ccc3BB8C1Ev),
  NSPAIR(_ZN3ccc3BB8D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
Class_Descriptor cd__ZN3ccc3BB8E = {  "_ZN3ccc3BB8E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB8E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB8E),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
namespace ccc { 
struct  EE8x0  : virtual ::ccc::AA8 {
  virtual void  abc(); // _ZN3ccc5EE8x03abcEv
  virtual void  efg(); // _ZN3ccc5EE8x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE8x03pqrEv
  ~EE8x0(); // tgen
  EE8x0(); // tgen
};
//SIG(1 _ZN3ccc5EE8x0E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x03abcEv");}
void  ccc::EE8x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x03efgEv");}
void  ccc::EE8x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x03pqrEv");}
ccc::EE8x0 ::~EE8x0(){ note_dtor("_ZN3ccc5EE8x0E", this);} // tgen
ccc::EE8x0 ::EE8x0(){ note_ctor("_ZN3ccc5EE8x0E", this);} // tgen
}
static void Test__ZN3ccc5EE8x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x0E, buf);
    ::ccc::EE8x0 *dp, &lv = *(dp=new (buf) ::ccc::EE8x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x0E);
    dp->::ccc::EE8x0::~EE8x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x0E(Test__ZN3ccc5EE8x0E, "_ZN3ccc5EE8x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x0C1Ev();
extern void _ZN3ccc5EE8x0D1Ev();
Name_Map name_map__ZN3ccc5EE8x0E[] = {
  NSPAIR(_ZN3ccc5EE8x0C1Ev),
  NSPAIR(_ZN3ccc5EE8x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x0E[];
extern void _ZN3ccc5EE8x03efgEv();
extern void _ZN3ccc5EE8x03abcEv();
extern void _ZN3ccc5EE8x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x0E[] = {
  {&(_ZTVN3ccc5EE8x0E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x0E[];
Class_Descriptor cd__ZN3ccc5EE8x0E = {  "_ZN3ccc5EE8x0E", // class name
  bases__ZN3ccc5EE8x0E, 1,
  &(vtc__ZN3ccc5EE8x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x0E),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
namespace ccc { 
struct  EE8x1  : virtual ::ccc::AA8 {
  virtual void  abc(); // _ZN3ccc5EE8x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE8x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE8x13efgEv
  ~EE8x1(); // tgen
  EE8x1(); // tgen
};
//SIG(1 _ZN3ccc5EE8x1E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x13abcEv");}
void  ccc::EE8x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x13pqrEv");}
void  ccc::EE8x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x13efgEv");}
ccc::EE8x1 ::~EE8x1(){ note_dtor("_ZN3ccc5EE8x1E", this);} // tgen
ccc::EE8x1 ::EE8x1(){ note_ctor("_ZN3ccc5EE8x1E", this);} // tgen
}
static void Test__ZN3ccc5EE8x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x1E, buf);
    ::ccc::EE8x1 *dp, &lv = *(dp=new (buf) ::ccc::EE8x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x1E);
    dp->::ccc::EE8x1::~EE8x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x1E(Test__ZN3ccc5EE8x1E, "_ZN3ccc5EE8x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x1C1Ev();
extern void _ZN3ccc5EE8x1D1Ev();
Name_Map name_map__ZN3ccc5EE8x1E[] = {
  NSPAIR(_ZN3ccc5EE8x1C1Ev),
  NSPAIR(_ZN3ccc5EE8x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x1E[];
extern void _ZN3ccc5EE8x13efgEv();
extern void _ZN3ccc5EE8x13abcEv();
extern void _ZN3ccc5EE8x13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x1E[] = {
  {&(_ZTVN3ccc5EE8x1E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x1E[];
Class_Descriptor cd__ZN3ccc5EE8x1E = {  "_ZN3ccc5EE8x1E", // class name
  bases__ZN3ccc5EE8x1E, 1,
  &(vtc__ZN3ccc5EE8x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x1E),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
namespace ccc { 
struct  EE8x2  : virtual ::ccc::AA8 {
  virtual void  efg(); // _ZN3ccc5EE8x23efgEv
  virtual void  abc(); // _ZN3ccc5EE8x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE8x23pqrEv
  ~EE8x2(); // tgen
  EE8x2(); // tgen
};
//SIG(1 _ZN3ccc5EE8x2E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x23efgEv");}
void  ccc::EE8x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x23abcEv");}
void  ccc::EE8x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x23pqrEv");}
ccc::EE8x2 ::~EE8x2(){ note_dtor("_ZN3ccc5EE8x2E", this);} // tgen
ccc::EE8x2 ::EE8x2(){ note_ctor("_ZN3ccc5EE8x2E", this);} // tgen
}
static void Test__ZN3ccc5EE8x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x2E, buf);
    ::ccc::EE8x2 *dp, &lv = *(dp=new (buf) ::ccc::EE8x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x2E);
    dp->::ccc::EE8x2::~EE8x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x2E(Test__ZN3ccc5EE8x2E, "_ZN3ccc5EE8x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x2C1Ev();
extern void _ZN3ccc5EE8x2D1Ev();
Name_Map name_map__ZN3ccc5EE8x2E[] = {
  NSPAIR(_ZN3ccc5EE8x2C1Ev),
  NSPAIR(_ZN3ccc5EE8x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x2E[];
extern void _ZN3ccc5EE8x23efgEv();
extern void _ZN3ccc5EE8x23abcEv();
extern void _ZN3ccc5EE8x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x2E[] = {
  {&(_ZTVN3ccc5EE8x2E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x2E[];
Class_Descriptor cd__ZN3ccc5EE8x2E = {  "_ZN3ccc5EE8x2E", // class name
  bases__ZN3ccc5EE8x2E, 1,
  &(vtc__ZN3ccc5EE8x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x2E),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
namespace ccc { 
struct  EE8x3  : virtual ::ccc::AA8 {
  virtual void  efg(); // _ZN3ccc5EE8x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE8x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE8x33abcEv
  ~EE8x3(); // tgen
  EE8x3(); // tgen
};
//SIG(1 _ZN3ccc5EE8x3E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x33efgEv");}
void  ccc::EE8x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x33pqrEv");}
void  ccc::EE8x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x33abcEv");}
ccc::EE8x3 ::~EE8x3(){ note_dtor("_ZN3ccc5EE8x3E", this);} // tgen
ccc::EE8x3 ::EE8x3(){ note_ctor("_ZN3ccc5EE8x3E", this);} // tgen
}
static void Test__ZN3ccc5EE8x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x3E, buf);
    ::ccc::EE8x3 *dp, &lv = *(dp=new (buf) ::ccc::EE8x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x3E);
    dp->::ccc::EE8x3::~EE8x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x3E(Test__ZN3ccc5EE8x3E, "_ZN3ccc5EE8x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x3C1Ev();
extern void _ZN3ccc5EE8x3D1Ev();
Name_Map name_map__ZN3ccc5EE8x3E[] = {
  NSPAIR(_ZN3ccc5EE8x3C1Ev),
  NSPAIR(_ZN3ccc5EE8x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x3E[];
extern void _ZN3ccc5EE8x33efgEv();
extern void _ZN3ccc5EE8x33abcEv();
extern void _ZN3ccc5EE8x33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x3E[] = {
  {&(_ZTVN3ccc5EE8x3E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x3E[];
Class_Descriptor cd__ZN3ccc5EE8x3E = {  "_ZN3ccc5EE8x3E", // class name
  bases__ZN3ccc5EE8x3E, 1,
  &(vtc__ZN3ccc5EE8x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x3E),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
namespace ccc { 
struct  EE8x4  : virtual ::ccc::AA8 {
  virtual void  pqr(); // _ZN3ccc5EE8x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE8x43abcEv
  virtual void  efg(); // _ZN3ccc5EE8x43efgEv
  ~EE8x4(); // tgen
  EE8x4(); // tgen
};
//SIG(1 _ZN3ccc5EE8x4E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x43pqrEv");}
void  ccc::EE8x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x43abcEv");}
void  ccc::EE8x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x43efgEv");}
ccc::EE8x4 ::~EE8x4(){ note_dtor("_ZN3ccc5EE8x4E", this);} // tgen
ccc::EE8x4 ::EE8x4(){ note_ctor("_ZN3ccc5EE8x4E", this);} // tgen
}
static void Test__ZN3ccc5EE8x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x4E, buf);
    ::ccc::EE8x4 *dp, &lv = *(dp=new (buf) ::ccc::EE8x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x4E);
    dp->::ccc::EE8x4::~EE8x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x4E(Test__ZN3ccc5EE8x4E, "_ZN3ccc5EE8x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x4C1Ev();
extern void _ZN3ccc5EE8x4D1Ev();
Name_Map name_map__ZN3ccc5EE8x4E[] = {
  NSPAIR(_ZN3ccc5EE8x4C1Ev),
  NSPAIR(_ZN3ccc5EE8x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x4E[];
extern void _ZN3ccc5EE8x43efgEv();
extern void _ZN3ccc5EE8x43abcEv();
extern void _ZN3ccc5EE8x43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x4E[] = {
  {&(_ZTVN3ccc5EE8x4E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x4E[];
Class_Descriptor cd__ZN3ccc5EE8x4E = {  "_ZN3ccc5EE8x4E", // class name
  bases__ZN3ccc5EE8x4E, 1,
  &(vtc__ZN3ccc5EE8x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x4E),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
namespace ccc { 
struct  EE8x5  : virtual ::ccc::AA8 {
  virtual void  pqr(); // _ZN3ccc5EE8x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE8x53efgEv
  virtual void  abc(); // _ZN3ccc5EE8x53abcEv
  ~EE8x5(); // tgen
  EE8x5(); // tgen
};
//SIG(1 _ZN3ccc5EE8x5E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE8x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x53pqrEv");}
void  ccc::EE8x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x53efgEv");}
void  ccc::EE8x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x53abcEv");}
ccc::EE8x5 ::~EE8x5(){ note_dtor("_ZN3ccc5EE8x5E", this);} // tgen
ccc::EE8x5 ::EE8x5(){ note_ctor("_ZN3ccc5EE8x5E", this);} // tgen
}
static void Test__ZN3ccc5EE8x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x5E, buf);
    ::ccc::EE8x5 *dp, &lv = *(dp=new (buf) ::ccc::EE8x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x5E);
    dp->::ccc::EE8x5::~EE8x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x5E(Test__ZN3ccc5EE8x5E, "_ZN3ccc5EE8x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x5C1Ev();
extern void _ZN3ccc5EE8x5D1Ev();
Name_Map name_map__ZN3ccc5EE8x5E[] = {
  NSPAIR(_ZN3ccc5EE8x5C1Ev),
  NSPAIR(_ZN3ccc5EE8x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x5E[];
extern void _ZN3ccc5EE8x53efgEv();
extern void _ZN3ccc5EE8x53abcEv();
extern void _ZN3ccc5EE8x53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x5E[] = {
  {&(_ZTVN3ccc5EE8x5E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x5E[];
Class_Descriptor cd__ZN3ccc5EE8x5E = {  "_ZN3ccc5EE8x5E", // class name
  bases__ZN3ccc5EE8x5E, 1,
  &(vtc__ZN3ccc5EE8x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x5E),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
namespace ccc { 
struct  EE8x6  : virtual ::ccc::AA8 {
  virtual void  abc(); // _ZN3ccc5EE8x63abcEv
  virtual void  efg(); // _ZN3ccc5EE8x63efgEv
  ~EE8x6(); // tgen
  EE8x6(); // tgen
};
//SIG(1 _ZN3ccc5EE8x6E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE8x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x63abcEv");}
void  ccc::EE8x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x63efgEv");}
ccc::EE8x6 ::~EE8x6(){ note_dtor("_ZN3ccc5EE8x6E", this);} // tgen
ccc::EE8x6 ::EE8x6(){ note_ctor("_ZN3ccc5EE8x6E", this);} // tgen
}
static void Test__ZN3ccc5EE8x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x6E, buf);
    ::ccc::EE8x6 *dp, &lv = *(dp=new (buf) ::ccc::EE8x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x6E);
    dp->::ccc::EE8x6::~EE8x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x6E(Test__ZN3ccc5EE8x6E, "_ZN3ccc5EE8x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x6C1Ev();
extern void _ZN3ccc5EE8x6D1Ev();
Name_Map name_map__ZN3ccc5EE8x6E[] = {
  NSPAIR(_ZN3ccc5EE8x6C1Ev),
  NSPAIR(_ZN3ccc5EE8x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x6E[];
extern void _ZN3ccc5EE8x63efgEv();
extern void _ZN3ccc5EE8x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x6E[] = {
  {&(_ZTVN3ccc5EE8x6E[5]),  5,7},
  {&(_ZTVN3ccc5EE8x6E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x6E[];
Class_Descriptor cd__ZN3ccc5EE8x6E = {  "_ZN3ccc5EE8x6E", // class name
  bases__ZN3ccc5EE8x6E, 1,
  &(vtc__ZN3ccc5EE8x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x6E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x6E),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
namespace ccc { 
struct  EE8x7  : virtual ::ccc::AA8 {
  virtual void  abc(); // _ZN3ccc5EE8x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE8x73pqrEv
  ~EE8x7(); // tgen
  EE8x7(); // tgen
};
//SIG(1 _ZN3ccc5EE8x7E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE8x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x73abcEv");}
void  ccc::EE8x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x73pqrEv");}
ccc::EE8x7 ::~EE8x7(){ note_dtor("_ZN3ccc5EE8x7E", this);} // tgen
ccc::EE8x7 ::EE8x7(){ note_ctor("_ZN3ccc5EE8x7E", this);} // tgen
}
static void Test__ZN3ccc5EE8x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x7E, buf);
    ::ccc::EE8x7 *dp, &lv = *(dp=new (buf) ::ccc::EE8x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x7E);
    dp->::ccc::EE8x7::~EE8x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x7E(Test__ZN3ccc5EE8x7E, "_ZN3ccc5EE8x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x7C1Ev();
extern void _ZN3ccc5EE8x7D1Ev();
Name_Map name_map__ZN3ccc5EE8x7E[] = {
  NSPAIR(_ZN3ccc5EE8x7C1Ev),
  NSPAIR(_ZN3ccc5EE8x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc5EE8x73abcEv();
extern void _ZN3ccc5EE8x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x7E[] = {
  {&(_ZTVN3ccc5EE8x7E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x7E[];
Class_Descriptor cd__ZN3ccc5EE8x7E = {  "_ZN3ccc5EE8x7E", // class name
  bases__ZN3ccc5EE8x7E, 1,
  &(vtc__ZN3ccc5EE8x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x7E),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
namespace ccc { 
struct  EE8x8  : virtual ::ccc::AA8 {
  virtual void  efg(); // _ZN3ccc5EE8x83efgEv
  virtual void  abc(); // _ZN3ccc5EE8x83abcEv
  ~EE8x8(); // tgen
  EE8x8(); // tgen
};
//SIG(1 _ZN3ccc5EE8x8E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE8x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x83efgEv");}
void  ccc::EE8x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE8x83abcEv");}
ccc::EE8x8 ::~EE8x8(){ note_dtor("_ZN3ccc5EE8x8E", this);} // tgen
ccc::EE8x8 ::EE8x8(){ note_ctor("_ZN3ccc5EE8x8E", this);} // tgen
}
static void Test__ZN3ccc5EE8x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x8E, buf);
    ::ccc::EE8x8 *dp, &lv = *(dp=new (buf) ::ccc::EE8x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x8E);
    dp->::ccc::EE8x8::~EE8x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x8E(Test__ZN3ccc5EE8x8E, "_ZN3ccc5EE8x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x8C1Ev();
extern void _ZN3ccc5EE8x8D1Ev();
Name_Map name_map__ZN3ccc5EE8x8E[] = {
  NSPAIR(_ZN3ccc5EE8x8C1Ev),
  NSPAIR(_ZN3ccc5EE8x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x8E[];
extern void _ZN3ccc5EE8x83efgEv();
extern void _ZN3ccc5EE8x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x8E[] = {
  {&(_ZTVN3ccc5EE8x8E[5]),  5,7},
  {&(_ZTVN3ccc5EE8x8E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x8E[];
Class_Descriptor cd__ZN3ccc5EE8x8E = {  "_ZN3ccc5EE8x8E", // class name
  bases__ZN3ccc5EE8x8E, 1,
  &(vtc__ZN3ccc5EE8x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x8E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x8E),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
namespace ccc { 
struct  EE8x9  : virtual ::ccc::AA8 {
  virtual void  efg(); // _ZN3ccc5EE8x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE8x93pqrEv
  ~EE8x9(); // tgen
  EE8x9(); // tgen
};
//SIG(1 _ZN3ccc5EE8x9E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE8x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE8x93efgEv");}
void  ccc::EE8x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE8x93pqrEv");}
ccc::EE8x9 ::~EE8x9(){ note_dtor("_ZN3ccc5EE8x9E", this);} // tgen
ccc::EE8x9 ::EE8x9(){ note_ctor("_ZN3ccc5EE8x9E", this);} // tgen
}
static void Test__ZN3ccc5EE8x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE8x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE8x9E, buf);
    ::ccc::EE8x9 *dp, &lv = *(dp=new (buf) ::ccc::EE8x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE8x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE8x9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc5EE8x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE8x9E);
    dp->::ccc::EE8x9::~EE8x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE8x9E(Test__ZN3ccc5EE8x9E, "_ZN3ccc5EE8x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE8x9C1Ev();
extern void _ZN3ccc5EE8x9D1Ev();
Name_Map name_map__ZN3ccc5EE8x9E[] = {
  NSPAIR(_ZN3ccc5EE8x9C1Ev),
  NSPAIR(_ZN3ccc5EE8x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc5EE8x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE8x9E[];
extern void _ZN3ccc5EE8x93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc5EE8x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE8x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE8x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE8x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc5EE8x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE8x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE8x9E[] = {
  {&(_ZTVN3ccc5EE8x9E[5]),  5,8},
  {&(_ZTVN3ccc5EE8x9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE8x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE8x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE8x9E[];
Class_Descriptor cd__ZN3ccc5EE8x9E = {  "_ZN3ccc5EE8x9E", // class name
  bases__ZN3ccc5EE8x9E, 1,
  &(vtc__ZN3ccc5EE8x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE8x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE8x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE8x9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE8x9E),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
namespace ccc { 
struct  EE8x10  : virtual ::ccc::AA8 {
  virtual void  pqr(); // _ZN3ccc6EE8x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE8x103abcEv
  ~EE8x10(); // tgen
  EE8x10(); // tgen
};
//SIG(1 _ZN3ccc6EE8x10E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE8x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE8x103pqrEv");}
void  ccc::EE8x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE8x103abcEv");}
ccc::EE8x10 ::~EE8x10(){ note_dtor("_ZN3ccc6EE8x10E", this);} // tgen
ccc::EE8x10 ::EE8x10(){ note_ctor("_ZN3ccc6EE8x10E", this);} // tgen
}
static void Test__ZN3ccc6EE8x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x10E, buf);
    ::ccc::EE8x10 *dp, &lv = *(dp=new (buf) ::ccc::EE8x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x10E);
    dp->::ccc::EE8x10::~EE8x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x10E(Test__ZN3ccc6EE8x10E, "_ZN3ccc6EE8x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x10C1Ev();
extern void _ZN3ccc6EE8x10D1Ev();
Name_Map name_map__ZN3ccc6EE8x10E[] = {
  NSPAIR(_ZN3ccc6EE8x10C1Ev),
  NSPAIR(_ZN3ccc6EE8x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc6EE8x103abcEv();
extern void _ZN3ccc6EE8x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE8x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE8x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x10E[] = {
  {&(_ZTVN3ccc6EE8x10E[5]),  5,8},
  {&(_ZTVN3ccc6EE8x10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x10E[];
Class_Descriptor cd__ZN3ccc6EE8x10E = {  "_ZN3ccc6EE8x10E", // class name
  bases__ZN3ccc6EE8x10E, 1,
  &(vtc__ZN3ccc6EE8x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x10E),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
namespace ccc { 
struct  EE8x11  : virtual ::ccc::AA8 {
  virtual void  pqr(); // _ZN3ccc6EE8x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE8x113efgEv
  ~EE8x11(); // tgen
  EE8x11(); // tgen
};
//SIG(1 _ZN3ccc6EE8x11E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE8x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE8x113pqrEv");}
void  ccc::EE8x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE8x113efgEv");}
ccc::EE8x11 ::~EE8x11(){ note_dtor("_ZN3ccc6EE8x11E", this);} // tgen
ccc::EE8x11 ::EE8x11(){ note_ctor("_ZN3ccc6EE8x11E", this);} // tgen
}
static void Test__ZN3ccc6EE8x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x11E, buf);
    ::ccc::EE8x11 *dp, &lv = *(dp=new (buf) ::ccc::EE8x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x11E);
    dp->::ccc::EE8x11::~EE8x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x11E(Test__ZN3ccc6EE8x11E, "_ZN3ccc6EE8x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x11C1Ev();
extern void _ZN3ccc6EE8x11D1Ev();
Name_Map name_map__ZN3ccc6EE8x11E[] = {
  NSPAIR(_ZN3ccc6EE8x11C1Ev),
  NSPAIR(_ZN3ccc6EE8x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x11E[];
extern void _ZN3ccc6EE8x113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc6EE8x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE8x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE8x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x11E[] = {
  {&(_ZTVN3ccc6EE8x11E[5]),  5,8},
  {&(_ZTVN3ccc6EE8x11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x11E[];
Class_Descriptor cd__ZN3ccc6EE8x11E = {  "_ZN3ccc6EE8x11E", // class name
  bases__ZN3ccc6EE8x11E, 1,
  &(vtc__ZN3ccc6EE8x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x11E),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
namespace ccc { 
struct  EE8x12  : virtual ::ccc::AA8 {
  virtual void  abc(); // _ZN3ccc6EE8x123abcEv
  ~EE8x12(); // tgen
  EE8x12(); // tgen
};
//SIG(1 _ZN3ccc6EE8x12E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE8x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE8x123abcEv");}
ccc::EE8x12 ::~EE8x12(){ note_dtor("_ZN3ccc6EE8x12E", this);} // tgen
ccc::EE8x12 ::EE8x12(){ note_ctor("_ZN3ccc6EE8x12E", this);} // tgen
}
static void Test__ZN3ccc6EE8x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x12E, buf);
    ::ccc::EE8x12 *dp, &lv = *(dp=new (buf) ::ccc::EE8x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x12E);
    dp->::ccc::EE8x12::~EE8x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x12E(Test__ZN3ccc6EE8x12E, "_ZN3ccc6EE8x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x12C1Ev();
extern void _ZN3ccc6EE8x12D1Ev();
Name_Map name_map__ZN3ccc6EE8x12E[] = {
  NSPAIR(_ZN3ccc6EE8x12C1Ev),
  NSPAIR(_ZN3ccc6EE8x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc6EE8x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE8x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x12E[] = {
  {&(_ZTVN3ccc6EE8x12E[5]),  5,7},
  {&(_ZTVN3ccc6EE8x12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x12E[];
Class_Descriptor cd__ZN3ccc6EE8x12E = {  "_ZN3ccc6EE8x12E", // class name
  bases__ZN3ccc6EE8x12E, 1,
  &(vtc__ZN3ccc6EE8x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x12E),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
namespace ccc { 
struct  EE8x13  : virtual ::ccc::AA8 {
  virtual void  efg(); // _ZN3ccc6EE8x133efgEv
  ~EE8x13(); // tgen
  EE8x13(); // tgen
};
//SIG(1 _ZN3ccc6EE8x13E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE8x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE8x133efgEv");}
ccc::EE8x13 ::~EE8x13(){ note_dtor("_ZN3ccc6EE8x13E", this);} // tgen
ccc::EE8x13 ::EE8x13(){ note_ctor("_ZN3ccc6EE8x13E", this);} // tgen
}
static void Test__ZN3ccc6EE8x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x13E, buf);
    ::ccc::EE8x13 *dp, &lv = *(dp=new (buf) ::ccc::EE8x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x13E);
    dp->::ccc::EE8x13::~EE8x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x13E(Test__ZN3ccc6EE8x13E, "_ZN3ccc6EE8x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x13C1Ev();
extern void _ZN3ccc6EE8x13D1Ev();
Name_Map name_map__ZN3ccc6EE8x13E[] = {
  NSPAIR(_ZN3ccc6EE8x13C1Ev),
  NSPAIR(_ZN3ccc6EE8x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x13E[];
extern void _ZN3ccc6EE8x133efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE8x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x13E[] = {
  {&(_ZTVN3ccc6EE8x13E[5]),  5,7},
  {&(_ZTVN3ccc6EE8x13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x13E[];
Class_Descriptor cd__ZN3ccc6EE8x13E = {  "_ZN3ccc6EE8x13E", // class name
  bases__ZN3ccc6EE8x13E, 1,
  &(vtc__ZN3ccc6EE8x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x13E),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
namespace ccc { 
struct  EE8x14  : virtual ::ccc::AA8 {
  virtual void  pqr(); // _ZN3ccc6EE8x143pqrEv
  ~EE8x14(); // tgen
  EE8x14(); // tgen
};
//SIG(1 _ZN3ccc6EE8x14E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE8x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE8x143pqrEv");}
ccc::EE8x14 ::~EE8x14(){ note_dtor("_ZN3ccc6EE8x14E", this);} // tgen
ccc::EE8x14 ::EE8x14(){ note_ctor("_ZN3ccc6EE8x14E", this);} // tgen
}
static void Test__ZN3ccc6EE8x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x14E, buf);
    ::ccc::EE8x14 *dp, &lv = *(dp=new (buf) ::ccc::EE8x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x14E);
    dp->::ccc::EE8x14::~EE8x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x14E(Test__ZN3ccc6EE8x14E, "_ZN3ccc6EE8x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x14C1Ev();
extern void _ZN3ccc6EE8x14D1Ev();
Name_Map name_map__ZN3ccc6EE8x14E[] = {
  NSPAIR(_ZN3ccc6EE8x14C1Ev),
  NSPAIR(_ZN3ccc6EE8x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc6EE8x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE8x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x14E[] = {
  {&(_ZTVN3ccc6EE8x14E[5]),  5,8},
  {&(_ZTVN3ccc6EE8x14E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x14E[];
Class_Descriptor cd__ZN3ccc6EE8x14E = {  "_ZN3ccc6EE8x14E", // class name
  bases__ZN3ccc6EE8x14E, 1,
  &(vtc__ZN3ccc6EE8x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x14E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x14E),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
namespace ccc { 
struct  EE8x15  : virtual ::ccc::AA8 {
  ~EE8x15(); // tgen
  EE8x15(); // tgen
};
//SIG(1 _ZN3ccc6EE8x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE8x15 ::~EE8x15(){ note_dtor("_ZN3ccc6EE8x15E", this);} // tgen
ccc::EE8x15 ::EE8x15(){ note_ctor("_ZN3ccc6EE8x15E", this);} // tgen
}
static void Test__ZN3ccc6EE8x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE8x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE8x15E, buf);
    ::ccc::EE8x15 *dp, &lv = *(dp=new (buf) ::ccc::EE8x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE8x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE8x15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc6EE8x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE8x15E);
    dp->::ccc::EE8x15::~EE8x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE8x15E(Test__ZN3ccc6EE8x15E, "_ZN3ccc6EE8x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE8x15C1Ev();
extern void _ZN3ccc6EE8x15D1Ev();
Name_Map name_map__ZN3ccc6EE8x15E[] = {
  NSPAIR(_ZN3ccc6EE8x15C1Ev),
  NSPAIR(_ZN3ccc6EE8x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
static Base_Class bases__ZN3ccc6EE8x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE8x15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE8x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE8x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE8x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE8x15E[] = {
  {&(_ZTVN3ccc6EE8x15E[5]),  5,7},
  {&(_ZTVN3ccc6EE8x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE8x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE8x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE8x15E[];
Class_Descriptor cd__ZN3ccc6EE8x15E = {  "_ZN3ccc6EE8x15E", // class name
  bases__ZN3ccc6EE8x15E, 1,
  &(vtc__ZN3ccc6EE8x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE8x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE8x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE8x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE8x15E),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
namespace ccc { 
struct  AA9  {
  virtual void  efg(); // _ZN3ccc3AA93efgEv
  virtual void  pqr(); // _ZN3ccc3AA93pqrEv
  ~AA9(); // tgen
  AA9(); // tgen
};
//SIG(-1 _ZN3ccc3AA9E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA9 ::efg(){vfunc_called(this, "_ZN3ccc3AA93efgEv");}
void  ccc::AA9 ::pqr(){vfunc_called(this, "_ZN3ccc3AA93pqrEv");}
ccc::AA9 ::~AA9(){ note_dtor("_ZN3ccc3AA9E", this);} // tgen
ccc::AA9 ::AA9(){ note_ctor("_ZN3ccc3AA9E", this);} // tgen
}
static void Test__ZN3ccc3AA9E()
{
  extern Class_Descriptor cd__ZN3ccc3AA9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3AA9E, buf);
    ::ccc::AA9 *dp, &lv = *(dp=new (buf) ::ccc::AA9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3AA9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3AA9E)");
    test_class_info(&lv, &cd__ZN3ccc3AA9E);
    dp->::ccc::AA9::~AA9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3AA9E(Test__ZN3ccc3AA9E, "_ZN3ccc3AA9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3AA9C1Ev();
extern void _ZN3ccc3AA9D1Ev();
Name_Map name_map__ZN3ccc3AA9E[] = {
  NSPAIR(_ZN3ccc3AA9C1Ev),
  NSPAIR(_ZN3ccc3AA9D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
Class_Descriptor cd__ZN3ccc3AA9E = {  "_ZN3ccc3AA9E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA9E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA9E),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
namespace ccc { 
struct  BB9  {
  virtual void  efg(); // _ZN3ccc3BB93efgEv
  virtual void  pqr(); // _ZN3ccc3BB93pqrEv
  ~BB9(); // tgen
  BB9(); // tgen
};
//SIG(1 _ZN3ccc3BB9E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB9 ::efg(){vfunc_called(this, "_ZN3ccc3BB93efgEv");}
void  ccc::BB9 ::pqr(){vfunc_called(this, "_ZN3ccc3BB93pqrEv");}
ccc::BB9 ::~BB9(){ note_dtor("_ZN3ccc3BB9E", this);} // tgen
ccc::BB9 ::BB9(){ note_ctor("_ZN3ccc3BB9E", this);} // tgen
}
static void Test__ZN3ccc3BB9E()
{
  extern Class_Descriptor cd__ZN3ccc3BB9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB9E, buf);
    ::ccc::BB9 *dp, &lv = *(dp=new (buf) ::ccc::BB9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB9E)");
    test_class_info(&lv, &cd__ZN3ccc3BB9E);
    dp->::ccc::BB9::~BB9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB9E(Test__ZN3ccc3BB9E, "_ZN3ccc3BB9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB9C1Ev();
extern void _ZN3ccc3BB9D1Ev();
Name_Map name_map__ZN3ccc3BB9E[] = {
  NSPAIR(_ZN3ccc3BB9C1Ev),
  NSPAIR(_ZN3ccc3BB9D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
Class_Descriptor cd__ZN3ccc3BB9E = {  "_ZN3ccc3BB9E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB9E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB9E),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
namespace ccc { 
struct  EE9x0  : virtual ::ccc::AA9 {
  virtual void  abc(); // _ZN3ccc5EE9x03abcEv
  virtual void  efg(); // _ZN3ccc5EE9x03efgEv
  virtual void  pqr(); // _ZN3ccc5EE9x03pqrEv
  ~EE9x0(); // tgen
  EE9x0(); // tgen
};
//SIG(1 _ZN3ccc5EE9x0E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x0 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x03abcEv");}
void  ccc::EE9x0 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x03efgEv");}
void  ccc::EE9x0 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x03pqrEv");}
ccc::EE9x0 ::~EE9x0(){ note_dtor("_ZN3ccc5EE9x0E", this);} // tgen
ccc::EE9x0 ::EE9x0(){ note_ctor("_ZN3ccc5EE9x0E", this);} // tgen
}
static void Test__ZN3ccc5EE9x0E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x0E, buf);
    ::ccc::EE9x0 *dp, &lv = *(dp=new (buf) ::ccc::EE9x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x0E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x0E);
    dp->::ccc::EE9x0::~EE9x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x0E(Test__ZN3ccc5EE9x0E, "_ZN3ccc5EE9x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x0C1Ev();
extern void _ZN3ccc5EE9x0D1Ev();
Name_Map name_map__ZN3ccc5EE9x0E[] = {
  NSPAIR(_ZN3ccc5EE9x0C1Ev),
  NSPAIR(_ZN3ccc5EE9x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x0E[];
extern void _ZN3ccc5EE9x03efgEv();
extern void _ZN3ccc5EE9x03pqrEv();
extern void _ZN3ccc5EE9x03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x0E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x0E[] = {
  {&(_ZTVN3ccc5EE9x0E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x0E[];
Class_Descriptor cd__ZN3ccc5EE9x0E = {  "_ZN3ccc5EE9x0E", // class name
  bases__ZN3ccc5EE9x0E, 1,
  &(vtc__ZN3ccc5EE9x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x0E),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
namespace ccc { 
struct  EE9x1  : virtual ::ccc::AA9 {
  virtual void  abc(); // _ZN3ccc5EE9x13abcEv
  virtual void  pqr(); // _ZN3ccc5EE9x13pqrEv
  virtual void  efg(); // _ZN3ccc5EE9x13efgEv
  ~EE9x1(); // tgen
  EE9x1(); // tgen
};
//SIG(1 _ZN3ccc5EE9x1E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x1 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x13abcEv");}
void  ccc::EE9x1 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x13pqrEv");}
void  ccc::EE9x1 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x13efgEv");}
ccc::EE9x1 ::~EE9x1(){ note_dtor("_ZN3ccc5EE9x1E", this);} // tgen
ccc::EE9x1 ::EE9x1(){ note_ctor("_ZN3ccc5EE9x1E", this);} // tgen
}
static void Test__ZN3ccc5EE9x1E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x1E, buf);
    ::ccc::EE9x1 *dp, &lv = *(dp=new (buf) ::ccc::EE9x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x1E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x1E);
    dp->::ccc::EE9x1::~EE9x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x1E(Test__ZN3ccc5EE9x1E, "_ZN3ccc5EE9x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x1C1Ev();
extern void _ZN3ccc5EE9x1D1Ev();
Name_Map name_map__ZN3ccc5EE9x1E[] = {
  NSPAIR(_ZN3ccc5EE9x1C1Ev),
  NSPAIR(_ZN3ccc5EE9x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x1E[];
extern void _ZN3ccc5EE9x13efgEv();
extern void _ZN3ccc5EE9x13pqrEv();
extern void _ZN3ccc5EE9x13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x1E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x1E[] = {
  {&(_ZTVN3ccc5EE9x1E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x1E[];
Class_Descriptor cd__ZN3ccc5EE9x1E = {  "_ZN3ccc5EE9x1E", // class name
  bases__ZN3ccc5EE9x1E, 1,
  &(vtc__ZN3ccc5EE9x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x1E),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
namespace ccc { 
struct  EE9x2  : virtual ::ccc::AA9 {
  virtual void  efg(); // _ZN3ccc5EE9x23efgEv
  virtual void  abc(); // _ZN3ccc5EE9x23abcEv
  virtual void  pqr(); // _ZN3ccc5EE9x23pqrEv
  ~EE9x2(); // tgen
  EE9x2(); // tgen
};
//SIG(1 _ZN3ccc5EE9x2E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x2 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x23efgEv");}
void  ccc::EE9x2 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x23abcEv");}
void  ccc::EE9x2 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x23pqrEv");}
ccc::EE9x2 ::~EE9x2(){ note_dtor("_ZN3ccc5EE9x2E", this);} // tgen
ccc::EE9x2 ::EE9x2(){ note_ctor("_ZN3ccc5EE9x2E", this);} // tgen
}
static void Test__ZN3ccc5EE9x2E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x2E, buf);
    ::ccc::EE9x2 *dp, &lv = *(dp=new (buf) ::ccc::EE9x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x2E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x2E);
    dp->::ccc::EE9x2::~EE9x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x2E(Test__ZN3ccc5EE9x2E, "_ZN3ccc5EE9x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x2C1Ev();
extern void _ZN3ccc5EE9x2D1Ev();
Name_Map name_map__ZN3ccc5EE9x2E[] = {
  NSPAIR(_ZN3ccc5EE9x2C1Ev),
  NSPAIR(_ZN3ccc5EE9x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x2E[];
extern void _ZN3ccc5EE9x23efgEv();
extern void _ZN3ccc5EE9x23pqrEv();
extern void _ZN3ccc5EE9x23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x2E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x2E[] = {
  {&(_ZTVN3ccc5EE9x2E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x2E[];
Class_Descriptor cd__ZN3ccc5EE9x2E = {  "_ZN3ccc5EE9x2E", // class name
  bases__ZN3ccc5EE9x2E, 1,
  &(vtc__ZN3ccc5EE9x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x2E),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
namespace ccc { 
struct  EE9x3  : virtual ::ccc::AA9 {
  virtual void  efg(); // _ZN3ccc5EE9x33efgEv
  virtual void  pqr(); // _ZN3ccc5EE9x33pqrEv
  virtual void  abc(); // _ZN3ccc5EE9x33abcEv
  ~EE9x3(); // tgen
  EE9x3(); // tgen
};
//SIG(1 _ZN3ccc5EE9x3E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x3 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x33efgEv");}
void  ccc::EE9x3 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x33pqrEv");}
void  ccc::EE9x3 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x33abcEv");}
ccc::EE9x3 ::~EE9x3(){ note_dtor("_ZN3ccc5EE9x3E", this);} // tgen
ccc::EE9x3 ::EE9x3(){ note_ctor("_ZN3ccc5EE9x3E", this);} // tgen
}
static void Test__ZN3ccc5EE9x3E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x3E, buf);
    ::ccc::EE9x3 *dp, &lv = *(dp=new (buf) ::ccc::EE9x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x3E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x3E);
    dp->::ccc::EE9x3::~EE9x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x3E(Test__ZN3ccc5EE9x3E, "_ZN3ccc5EE9x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x3C1Ev();
extern void _ZN3ccc5EE9x3D1Ev();
Name_Map name_map__ZN3ccc5EE9x3E[] = {
  NSPAIR(_ZN3ccc5EE9x3C1Ev),
  NSPAIR(_ZN3ccc5EE9x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x3E[];
extern void _ZN3ccc5EE9x33efgEv();
extern void _ZN3ccc5EE9x33pqrEv();
extern void _ZN3ccc5EE9x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x3E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x3E[] = {
  {&(_ZTVN3ccc5EE9x3E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x3E[];
Class_Descriptor cd__ZN3ccc5EE9x3E = {  "_ZN3ccc5EE9x3E", // class name
  bases__ZN3ccc5EE9x3E, 1,
  &(vtc__ZN3ccc5EE9x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x3E),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
namespace ccc { 
struct  EE9x4  : virtual ::ccc::AA9 {
  virtual void  pqr(); // _ZN3ccc5EE9x43pqrEv
  virtual void  abc(); // _ZN3ccc5EE9x43abcEv
  virtual void  efg(); // _ZN3ccc5EE9x43efgEv
  ~EE9x4(); // tgen
  EE9x4(); // tgen
};
//SIG(1 _ZN3ccc5EE9x4E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x4 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x43pqrEv");}
void  ccc::EE9x4 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x43abcEv");}
void  ccc::EE9x4 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x43efgEv");}
ccc::EE9x4 ::~EE9x4(){ note_dtor("_ZN3ccc5EE9x4E", this);} // tgen
ccc::EE9x4 ::EE9x4(){ note_ctor("_ZN3ccc5EE9x4E", this);} // tgen
}
static void Test__ZN3ccc5EE9x4E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x4E, buf);
    ::ccc::EE9x4 *dp, &lv = *(dp=new (buf) ::ccc::EE9x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x4E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x4E);
    dp->::ccc::EE9x4::~EE9x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x4E(Test__ZN3ccc5EE9x4E, "_ZN3ccc5EE9x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x4C1Ev();
extern void _ZN3ccc5EE9x4D1Ev();
Name_Map name_map__ZN3ccc5EE9x4E[] = {
  NSPAIR(_ZN3ccc5EE9x4C1Ev),
  NSPAIR(_ZN3ccc5EE9x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x4E[];
extern void _ZN3ccc5EE9x43efgEv();
extern void _ZN3ccc5EE9x43pqrEv();
extern void _ZN3ccc5EE9x43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x4E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x4E[] = {
  {&(_ZTVN3ccc5EE9x4E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x4E[];
Class_Descriptor cd__ZN3ccc5EE9x4E = {  "_ZN3ccc5EE9x4E", // class name
  bases__ZN3ccc5EE9x4E, 1,
  &(vtc__ZN3ccc5EE9x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x4E),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
namespace ccc { 
struct  EE9x5  : virtual ::ccc::AA9 {
  virtual void  pqr(); // _ZN3ccc5EE9x53pqrEv
  virtual void  efg(); // _ZN3ccc5EE9x53efgEv
  virtual void  abc(); // _ZN3ccc5EE9x53abcEv
  ~EE9x5(); // tgen
  EE9x5(); // tgen
};
//SIG(1 _ZN3ccc5EE9x5E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE9x5 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x53pqrEv");}
void  ccc::EE9x5 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x53efgEv");}
void  ccc::EE9x5 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x53abcEv");}
ccc::EE9x5 ::~EE9x5(){ note_dtor("_ZN3ccc5EE9x5E", this);} // tgen
ccc::EE9x5 ::EE9x5(){ note_ctor("_ZN3ccc5EE9x5E", this);} // tgen
}
static void Test__ZN3ccc5EE9x5E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x5E, buf);
    ::ccc::EE9x5 *dp, &lv = *(dp=new (buf) ::ccc::EE9x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x5E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x5E);
    dp->::ccc::EE9x5::~EE9x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x5E(Test__ZN3ccc5EE9x5E, "_ZN3ccc5EE9x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x5C1Ev();
extern void _ZN3ccc5EE9x5D1Ev();
Name_Map name_map__ZN3ccc5EE9x5E[] = {
  NSPAIR(_ZN3ccc5EE9x5C1Ev),
  NSPAIR(_ZN3ccc5EE9x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x5E[];
extern void _ZN3ccc5EE9x53efgEv();
extern void _ZN3ccc5EE9x53pqrEv();
extern void _ZN3ccc5EE9x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x5E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x5E[] = {
  {&(_ZTVN3ccc5EE9x5E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x5E[];
Class_Descriptor cd__ZN3ccc5EE9x5E = {  "_ZN3ccc5EE9x5E", // class name
  bases__ZN3ccc5EE9x5E, 1,
  &(vtc__ZN3ccc5EE9x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x5E),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
namespace ccc { 
struct  EE9x6  : virtual ::ccc::AA9 {
  virtual void  abc(); // _ZN3ccc5EE9x63abcEv
  virtual void  efg(); // _ZN3ccc5EE9x63efgEv
  ~EE9x6(); // tgen
  EE9x6(); // tgen
};
//SIG(1 _ZN3ccc5EE9x6E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE9x6 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x63abcEv");}
void  ccc::EE9x6 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x63efgEv");}
ccc::EE9x6 ::~EE9x6(){ note_dtor("_ZN3ccc5EE9x6E", this);} // tgen
ccc::EE9x6 ::EE9x6(){ note_ctor("_ZN3ccc5EE9x6E", this);} // tgen
}
static void Test__ZN3ccc5EE9x6E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x6E, buf);
    ::ccc::EE9x6 *dp, &lv = *(dp=new (buf) ::ccc::EE9x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x6E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x6E);
    dp->::ccc::EE9x6::~EE9x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x6E(Test__ZN3ccc5EE9x6E, "_ZN3ccc5EE9x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x6C1Ev();
extern void _ZN3ccc5EE9x6D1Ev();
Name_Map name_map__ZN3ccc5EE9x6E[] = {
  NSPAIR(_ZN3ccc5EE9x6C1Ev),
  NSPAIR(_ZN3ccc5EE9x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x6E[];
extern void _ZN3ccc5EE9x63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc5EE9x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x6E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x6E[] = {
  {&(_ZTVN3ccc5EE9x6E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x6E[];
Class_Descriptor cd__ZN3ccc5EE9x6E = {  "_ZN3ccc5EE9x6E", // class name
  bases__ZN3ccc5EE9x6E, 1,
  &(vtc__ZN3ccc5EE9x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x6E),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
namespace ccc { 
struct  EE9x7  : virtual ::ccc::AA9 {
  virtual void  abc(); // _ZN3ccc5EE9x73abcEv
  virtual void  pqr(); // _ZN3ccc5EE9x73pqrEv
  ~EE9x7(); // tgen
  EE9x7(); // tgen
};
//SIG(1 _ZN3ccc5EE9x7E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE9x7 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x73abcEv");}
void  ccc::EE9x7 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x73pqrEv");}
ccc::EE9x7 ::~EE9x7(){ note_dtor("_ZN3ccc5EE9x7E", this);} // tgen
ccc::EE9x7 ::EE9x7(){ note_ctor("_ZN3ccc5EE9x7E", this);} // tgen
}
static void Test__ZN3ccc5EE9x7E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x7E, buf);
    ::ccc::EE9x7 *dp, &lv = *(dp=new (buf) ::ccc::EE9x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x7E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x7E);
    dp->::ccc::EE9x7::~EE9x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x7E(Test__ZN3ccc5EE9x7E, "_ZN3ccc5EE9x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x7C1Ev();
extern void _ZN3ccc5EE9x7D1Ev();
Name_Map name_map__ZN3ccc5EE9x7E[] = {
  NSPAIR(_ZN3ccc5EE9x7C1Ev),
  NSPAIR(_ZN3ccc5EE9x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc5EE9x73pqrEv();
extern void _ZN3ccc5EE9x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x7E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x7E[] = {
  {&(_ZTVN3ccc5EE9x7E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x7E[];
Class_Descriptor cd__ZN3ccc5EE9x7E = {  "_ZN3ccc5EE9x7E", // class name
  bases__ZN3ccc5EE9x7E, 1,
  &(vtc__ZN3ccc5EE9x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x7E),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
namespace ccc { 
struct  EE9x8  : virtual ::ccc::AA9 {
  virtual void  efg(); // _ZN3ccc5EE9x83efgEv
  virtual void  abc(); // _ZN3ccc5EE9x83abcEv
  ~EE9x8(); // tgen
  EE9x8(); // tgen
};
//SIG(1 _ZN3ccc5EE9x8E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE9x8 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x83efgEv");}
void  ccc::EE9x8 ::abc(){vfunc_called(this, "_ZN3ccc5EE9x83abcEv");}
ccc::EE9x8 ::~EE9x8(){ note_dtor("_ZN3ccc5EE9x8E", this);} // tgen
ccc::EE9x8 ::EE9x8(){ note_ctor("_ZN3ccc5EE9x8E", this);} // tgen
}
static void Test__ZN3ccc5EE9x8E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x8E, buf);
    ::ccc::EE9x8 *dp, &lv = *(dp=new (buf) ::ccc::EE9x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x8E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x8E);
    dp->::ccc::EE9x8::~EE9x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x8E(Test__ZN3ccc5EE9x8E, "_ZN3ccc5EE9x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x8C1Ev();
extern void _ZN3ccc5EE9x8D1Ev();
Name_Map name_map__ZN3ccc5EE9x8E[] = {
  NSPAIR(_ZN3ccc5EE9x8C1Ev),
  NSPAIR(_ZN3ccc5EE9x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x8E[];
extern void _ZN3ccc5EE9x83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc5EE9x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x8E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x8E[] = {
  {&(_ZTVN3ccc5EE9x8E[5]),  5,8},
  {&(_ZTVN3ccc5EE9x8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x8E[];
Class_Descriptor cd__ZN3ccc5EE9x8E = {  "_ZN3ccc5EE9x8E", // class name
  bases__ZN3ccc5EE9x8E, 1,
  &(vtc__ZN3ccc5EE9x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x8E),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
namespace ccc { 
struct  EE9x9  : virtual ::ccc::AA9 {
  virtual void  efg(); // _ZN3ccc5EE9x93efgEv
  virtual void  pqr(); // _ZN3ccc5EE9x93pqrEv
  ~EE9x9(); // tgen
  EE9x9(); // tgen
};
//SIG(1 _ZN3ccc5EE9x9E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE9x9 ::efg(){vfunc_called(this, "_ZN3ccc5EE9x93efgEv");}
void  ccc::EE9x9 ::pqr(){vfunc_called(this, "_ZN3ccc5EE9x93pqrEv");}
ccc::EE9x9 ::~EE9x9(){ note_dtor("_ZN3ccc5EE9x9E", this);} // tgen
ccc::EE9x9 ::EE9x9(){ note_ctor("_ZN3ccc5EE9x9E", this);} // tgen
}
static void Test__ZN3ccc5EE9x9E()
{
  extern Class_Descriptor cd__ZN3ccc5EE9x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc5EE9x9E, buf);
    ::ccc::EE9x9 *dp, &lv = *(dp=new (buf) ::ccc::EE9x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc5EE9x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc5EE9x9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc5EE9x9E");
    test_class_info(&lv, &cd__ZN3ccc5EE9x9E);
    dp->::ccc::EE9x9::~EE9x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc5EE9x9E(Test__ZN3ccc5EE9x9E, "_ZN3ccc5EE9x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc5EE9x9C1Ev();
extern void _ZN3ccc5EE9x9D1Ev();
Name_Map name_map__ZN3ccc5EE9x9E[] = {
  NSPAIR(_ZN3ccc5EE9x9C1Ev),
  NSPAIR(_ZN3ccc5EE9x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc5EE9x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc5EE9x9E[];
extern void _ZN3ccc5EE9x93efgEv();
extern void _ZN3ccc5EE9x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc5EE9x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE9x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc5EE9x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc5EE9x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc5EE9x9E[];
static  VTT_ENTRY vtt__ZN3ccc5EE9x9E[] = {
  {&(_ZTVN3ccc5EE9x9E[5]),  5,7},
  {&(_ZTVN3ccc5EE9x9E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc5EE9x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE9x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE9x9E[];
Class_Descriptor cd__ZN3ccc5EE9x9E = {  "_ZN3ccc5EE9x9E", // class name
  bases__ZN3ccc5EE9x9E, 1,
  &(vtc__ZN3ccc5EE9x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc5EE9x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc5EE9x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc5EE9x9E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc5EE9x9E),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
namespace ccc { 
struct  EE9x10  : virtual ::ccc::AA9 {
  virtual void  pqr(); // _ZN3ccc6EE9x103pqrEv
  virtual void  abc(); // _ZN3ccc6EE9x103abcEv
  ~EE9x10(); // tgen
  EE9x10(); // tgen
};
//SIG(1 _ZN3ccc6EE9x10E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE9x10 ::pqr(){vfunc_called(this, "_ZN3ccc6EE9x103pqrEv");}
void  ccc::EE9x10 ::abc(){vfunc_called(this, "_ZN3ccc6EE9x103abcEv");}
ccc::EE9x10 ::~EE9x10(){ note_dtor("_ZN3ccc6EE9x10E", this);} // tgen
ccc::EE9x10 ::EE9x10(){ note_ctor("_ZN3ccc6EE9x10E", this);} // tgen
}
static void Test__ZN3ccc6EE9x10E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x10E, buf);
    ::ccc::EE9x10 *dp, &lv = *(dp=new (buf) ::ccc::EE9x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x10E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x10E);
    dp->::ccc::EE9x10::~EE9x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x10E(Test__ZN3ccc6EE9x10E, "_ZN3ccc6EE9x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x10C1Ev();
extern void _ZN3ccc6EE9x10D1Ev();
Name_Map name_map__ZN3ccc6EE9x10E[] = {
  NSPAIR(_ZN3ccc6EE9x10C1Ev),
  NSPAIR(_ZN3ccc6EE9x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc6EE9x103pqrEv();
extern void _ZN3ccc6EE9x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE9x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE9x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x10E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x10E[] = {
  {&(_ZTVN3ccc6EE9x10E[5]),  5,8},
  {&(_ZTVN3ccc6EE9x10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x10E[];
Class_Descriptor cd__ZN3ccc6EE9x10E = {  "_ZN3ccc6EE9x10E", // class name
  bases__ZN3ccc6EE9x10E, 1,
  &(vtc__ZN3ccc6EE9x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x10E),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
namespace ccc { 
struct  EE9x11  : virtual ::ccc::AA9 {
  virtual void  pqr(); // _ZN3ccc6EE9x113pqrEv
  virtual void  efg(); // _ZN3ccc6EE9x113efgEv
  ~EE9x11(); // tgen
  EE9x11(); // tgen
};
//SIG(1 _ZN3ccc6EE9x11E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE9x11 ::pqr(){vfunc_called(this, "_ZN3ccc6EE9x113pqrEv");}
void  ccc::EE9x11 ::efg(){vfunc_called(this, "_ZN3ccc6EE9x113efgEv");}
ccc::EE9x11 ::~EE9x11(){ note_dtor("_ZN3ccc6EE9x11E", this);} // tgen
ccc::EE9x11 ::EE9x11(){ note_ctor("_ZN3ccc6EE9x11E", this);} // tgen
}
static void Test__ZN3ccc6EE9x11E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x11E, buf);
    ::ccc::EE9x11 *dp, &lv = *(dp=new (buf) ::ccc::EE9x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x11E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x11E);
    dp->::ccc::EE9x11::~EE9x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x11E(Test__ZN3ccc6EE9x11E, "_ZN3ccc6EE9x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x11C1Ev();
extern void _ZN3ccc6EE9x11D1Ev();
Name_Map name_map__ZN3ccc6EE9x11E[] = {
  NSPAIR(_ZN3ccc6EE9x11C1Ev),
  NSPAIR(_ZN3ccc6EE9x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x11E[];
extern void _ZN3ccc6EE9x113efgEv();
extern void _ZN3ccc6EE9x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE9x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE9x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x11E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x11E[] = {
  {&(_ZTVN3ccc6EE9x11E[5]),  5,7},
  {&(_ZTVN3ccc6EE9x11E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x11E[];
Class_Descriptor cd__ZN3ccc6EE9x11E = {  "_ZN3ccc6EE9x11E", // class name
  bases__ZN3ccc6EE9x11E, 1,
  &(vtc__ZN3ccc6EE9x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x11E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x11E),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
namespace ccc { 
struct  EE9x12  : virtual ::ccc::AA9 {
  virtual void  abc(); // _ZN3ccc6EE9x123abcEv
  ~EE9x12(); // tgen
  EE9x12(); // tgen
};
//SIG(1 _ZN3ccc6EE9x12E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE9x12 ::abc(){vfunc_called(this, "_ZN3ccc6EE9x123abcEv");}
ccc::EE9x12 ::~EE9x12(){ note_dtor("_ZN3ccc6EE9x12E", this);} // tgen
ccc::EE9x12 ::EE9x12(){ note_ctor("_ZN3ccc6EE9x12E", this);} // tgen
}
static void Test__ZN3ccc6EE9x12E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x12E, buf);
    ::ccc::EE9x12 *dp, &lv = *(dp=new (buf) ::ccc::EE9x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x12E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x12E);
    dp->::ccc::EE9x12::~EE9x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x12E(Test__ZN3ccc6EE9x12E, "_ZN3ccc6EE9x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x12C1Ev();
extern void _ZN3ccc6EE9x12D1Ev();
Name_Map name_map__ZN3ccc6EE9x12E[] = {
  NSPAIR(_ZN3ccc6EE9x12C1Ev),
  NSPAIR(_ZN3ccc6EE9x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc6EE9x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE9x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x12E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x12E[] = {
  {&(_ZTVN3ccc6EE9x12E[5]),  5,8},
  {&(_ZTVN3ccc6EE9x12E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x12E[];
Class_Descriptor cd__ZN3ccc6EE9x12E = {  "_ZN3ccc6EE9x12E", // class name
  bases__ZN3ccc6EE9x12E, 1,
  &(vtc__ZN3ccc6EE9x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x12E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x12E),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
namespace ccc { 
struct  EE9x13  : virtual ::ccc::AA9 {
  virtual void  efg(); // _ZN3ccc6EE9x133efgEv
  ~EE9x13(); // tgen
  EE9x13(); // tgen
};
//SIG(1 _ZN3ccc6EE9x13E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE9x13 ::efg(){vfunc_called(this, "_ZN3ccc6EE9x133efgEv");}
ccc::EE9x13 ::~EE9x13(){ note_dtor("_ZN3ccc6EE9x13E", this);} // tgen
ccc::EE9x13 ::EE9x13(){ note_ctor("_ZN3ccc6EE9x13E", this);} // tgen
}
static void Test__ZN3ccc6EE9x13E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x13E, buf);
    ::ccc::EE9x13 *dp, &lv = *(dp=new (buf) ::ccc::EE9x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x13E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x13E);
    dp->::ccc::EE9x13::~EE9x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x13E(Test__ZN3ccc6EE9x13E, "_ZN3ccc6EE9x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x13C1Ev();
extern void _ZN3ccc6EE9x13D1Ev();
Name_Map name_map__ZN3ccc6EE9x13E[] = {
  NSPAIR(_ZN3ccc6EE9x13C1Ev),
  NSPAIR(_ZN3ccc6EE9x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x13E[];
extern void _ZN3ccc6EE9x133efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE9x133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x13E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x13E[] = {
  {&(_ZTVN3ccc6EE9x13E[5]),  5,7},
  {&(_ZTVN3ccc6EE9x13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x13E[];
Class_Descriptor cd__ZN3ccc6EE9x13E = {  "_ZN3ccc6EE9x13E", // class name
  bases__ZN3ccc6EE9x13E, 1,
  &(vtc__ZN3ccc6EE9x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x13E),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
namespace ccc { 
struct  EE9x14  : virtual ::ccc::AA9 {
  virtual void  pqr(); // _ZN3ccc6EE9x143pqrEv
  ~EE9x14(); // tgen
  EE9x14(); // tgen
};
//SIG(1 _ZN3ccc6EE9x14E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE9x14 ::pqr(){vfunc_called(this, "_ZN3ccc6EE9x143pqrEv");}
ccc::EE9x14 ::~EE9x14(){ note_dtor("_ZN3ccc6EE9x14E", this);} // tgen
ccc::EE9x14 ::EE9x14(){ note_ctor("_ZN3ccc6EE9x14E", this);} // tgen
}
static void Test__ZN3ccc6EE9x14E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x14E, buf);
    ::ccc::EE9x14 *dp, &lv = *(dp=new (buf) ::ccc::EE9x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x14E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x14E);
    dp->::ccc::EE9x14::~EE9x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x14E(Test__ZN3ccc6EE9x14E, "_ZN3ccc6EE9x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x14C1Ev();
extern void _ZN3ccc6EE9x14D1Ev();
Name_Map name_map__ZN3ccc6EE9x14E[] = {
  NSPAIR(_ZN3ccc6EE9x14C1Ev),
  NSPAIR(_ZN3ccc6EE9x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc6EE9x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE9x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x14E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x14E[] = {
  {&(_ZTVN3ccc6EE9x14E[5]),  5,7},
  {&(_ZTVN3ccc6EE9x14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x14E[];
Class_Descriptor cd__ZN3ccc6EE9x14E = {  "_ZN3ccc6EE9x14E", // class name
  bases__ZN3ccc6EE9x14E, 1,
  &(vtc__ZN3ccc6EE9x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x14E),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
namespace ccc { 
struct  EE9x15  : virtual ::ccc::AA9 {
  ~EE9x15(); // tgen
  EE9x15(); // tgen
};
//SIG(1 _ZN3ccc6EE9x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE9x15 ::~EE9x15(){ note_dtor("_ZN3ccc6EE9x15E", this);} // tgen
ccc::EE9x15 ::EE9x15(){ note_ctor("_ZN3ccc6EE9x15E", this);} // tgen
}
static void Test__ZN3ccc6EE9x15E()
{
  extern Class_Descriptor cd__ZN3ccc6EE9x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE9x15E, buf);
    ::ccc::EE9x15 *dp, &lv = *(dp=new (buf) ::ccc::EE9x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE9x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE9x15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc6EE9x15E");
    test_class_info(&lv, &cd__ZN3ccc6EE9x15E);
    dp->::ccc::EE9x15::~EE9x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE9x15E(Test__ZN3ccc6EE9x15E, "_ZN3ccc6EE9x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE9x15C1Ev();
extern void _ZN3ccc6EE9x15D1Ev();
Name_Map name_map__ZN3ccc6EE9x15E[] = {
  NSPAIR(_ZN3ccc6EE9x15C1Ev),
  NSPAIR(_ZN3ccc6EE9x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
static Base_Class bases__ZN3ccc6EE9x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE9x15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE9x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE9x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE9x15E[];
static  VTT_ENTRY vtt__ZN3ccc6EE9x15E[] = {
  {&(_ZTVN3ccc6EE9x15E[5]),  5,7},
  {&(_ZTVN3ccc6EE9x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE9x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE9x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE9x15E[];
Class_Descriptor cd__ZN3ccc6EE9x15E = {  "_ZN3ccc6EE9x15E", // class name
  bases__ZN3ccc6EE9x15E, 1,
  &(vtc__ZN3ccc6EE9x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE9x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE9x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE9x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE9x15E),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
namespace ccc { 
struct  AA10  {
  virtual void  pqr(); // _ZN3ccc4AA103pqrEv
  virtual void  abc(); // _ZN3ccc4AA103abcEv
  ~AA10(); // tgen
  AA10(); // tgen
};
//SIG(-1 _ZN3ccc4AA10E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA10 ::pqr(){vfunc_called(this, "_ZN3ccc4AA103pqrEv");}
void  ccc::AA10 ::abc(){vfunc_called(this, "_ZN3ccc4AA103abcEv");}
ccc::AA10 ::~AA10(){ note_dtor("_ZN3ccc4AA10E", this);} // tgen
ccc::AA10 ::AA10(){ note_ctor("_ZN3ccc4AA10E", this);} // tgen
}
static void Test__ZN3ccc4AA10E()
{
  extern Class_Descriptor cd__ZN3ccc4AA10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4AA10E, buf);
    ::ccc::AA10 *dp, &lv = *(dp=new (buf) ::ccc::AA10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4AA10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4AA10E)");
    test_class_info(&lv, &cd__ZN3ccc4AA10E);
    dp->::ccc::AA10::~AA10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4AA10E(Test__ZN3ccc4AA10E, "_ZN3ccc4AA10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4AA10C1Ev();
extern void _ZN3ccc4AA10D1Ev();
Name_Map name_map__ZN3ccc4AA10E[] = {
  NSPAIR(_ZN3ccc4AA10C1Ev),
  NSPAIR(_ZN3ccc4AA10D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc4AA10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4AA10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
Class_Descriptor cd__ZN3ccc4AA10E = {  "_ZN3ccc4AA10E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4AA10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4AA10E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4AA10E),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
namespace ccc { 
struct  BB10  {
  virtual void  pqr(); // _ZN3ccc4BB103pqrEv
  virtual void  abc(); // _ZN3ccc4BB103abcEv
  ~BB10(); // tgen
  BB10(); // tgen
};
//SIG(1 _ZN3ccc4BB10E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB10 ::pqr(){vfunc_called(this, "_ZN3ccc4BB103pqrEv");}
void  ccc::BB10 ::abc(){vfunc_called(this, "_ZN3ccc4BB103abcEv");}
ccc::BB10 ::~BB10(){ note_dtor("_ZN3ccc4BB10E", this);} // tgen
ccc::BB10 ::BB10(){ note_ctor("_ZN3ccc4BB10E", this);} // tgen
}
static void Test__ZN3ccc4BB10E()
{
  extern Class_Descriptor cd__ZN3ccc4BB10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4BB10E, buf);
    ::ccc::BB10 *dp, &lv = *(dp=new (buf) ::ccc::BB10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4BB10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4BB10E)");
    test_class_info(&lv, &cd__ZN3ccc4BB10E);
    dp->::ccc::BB10::~BB10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4BB10E(Test__ZN3ccc4BB10E, "_ZN3ccc4BB10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4BB10C1Ev();
extern void _ZN3ccc4BB10D1Ev();
Name_Map name_map__ZN3ccc4BB10E[] = {
  NSPAIR(_ZN3ccc4BB10C1Ev),
  NSPAIR(_ZN3ccc4BB10D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc4BB10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4BB10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
Class_Descriptor cd__ZN3ccc4BB10E = {  "_ZN3ccc4BB10E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4BB10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4BB10E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4BB10E),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
namespace ccc { 
struct  EE10x0  : virtual ::ccc::AA10 {
  virtual void  abc(); // _ZN3ccc6EE10x03abcEv
  virtual void  efg(); // _ZN3ccc6EE10x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE10x03pqrEv
  ~EE10x0(); // tgen
  EE10x0(); // tgen
};
//SIG(1 _ZN3ccc6EE10x0E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x03abcEv");}
void  ccc::EE10x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x03efgEv");}
void  ccc::EE10x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x03pqrEv");}
ccc::EE10x0 ::~EE10x0(){ note_dtor("_ZN3ccc6EE10x0E", this);} // tgen
ccc::EE10x0 ::EE10x0(){ note_ctor("_ZN3ccc6EE10x0E", this);} // tgen
}
static void Test__ZN3ccc6EE10x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x0E, buf);
    ::ccc::EE10x0 *dp, &lv = *(dp=new (buf) ::ccc::EE10x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x0E);
    dp->::ccc::EE10x0::~EE10x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x0E(Test__ZN3ccc6EE10x0E, "_ZN3ccc6EE10x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x0C1Ev();
extern void _ZN3ccc6EE10x0D1Ev();
Name_Map name_map__ZN3ccc6EE10x0E[] = {
  NSPAIR(_ZN3ccc6EE10x0C1Ev),
  NSPAIR(_ZN3ccc6EE10x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x0E[];
extern void _ZN3ccc6EE10x03pqrEv();
extern void _ZN3ccc6EE10x03abcEv();
extern void _ZN3ccc6EE10x03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x0E[] = {
  {&(_ZTVN3ccc6EE10x0E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x0E[];
Class_Descriptor cd__ZN3ccc6EE10x0E = {  "_ZN3ccc6EE10x0E", // class name
  bases__ZN3ccc6EE10x0E, 1,
  &(vtc__ZN3ccc6EE10x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x0E),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
namespace ccc { 
struct  EE10x1  : virtual ::ccc::AA10 {
  virtual void  abc(); // _ZN3ccc6EE10x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE10x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE10x13efgEv
  ~EE10x1(); // tgen
  EE10x1(); // tgen
};
//SIG(1 _ZN3ccc6EE10x1E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x13abcEv");}
void  ccc::EE10x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x13pqrEv");}
void  ccc::EE10x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x13efgEv");}
ccc::EE10x1 ::~EE10x1(){ note_dtor("_ZN3ccc6EE10x1E", this);} // tgen
ccc::EE10x1 ::EE10x1(){ note_ctor("_ZN3ccc6EE10x1E", this);} // tgen
}
static void Test__ZN3ccc6EE10x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x1E, buf);
    ::ccc::EE10x1 *dp, &lv = *(dp=new (buf) ::ccc::EE10x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x1E);
    dp->::ccc::EE10x1::~EE10x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x1E(Test__ZN3ccc6EE10x1E, "_ZN3ccc6EE10x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x1C1Ev();
extern void _ZN3ccc6EE10x1D1Ev();
Name_Map name_map__ZN3ccc6EE10x1E[] = {
  NSPAIR(_ZN3ccc6EE10x1C1Ev),
  NSPAIR(_ZN3ccc6EE10x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x1E[];
extern void _ZN3ccc6EE10x13pqrEv();
extern void _ZN3ccc6EE10x13abcEv();
extern void _ZN3ccc6EE10x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x1E[] = {
  {&(_ZTVN3ccc6EE10x1E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x1E[];
Class_Descriptor cd__ZN3ccc6EE10x1E = {  "_ZN3ccc6EE10x1E", // class name
  bases__ZN3ccc6EE10x1E, 1,
  &(vtc__ZN3ccc6EE10x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x1E),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
namespace ccc { 
struct  EE10x2  : virtual ::ccc::AA10 {
  virtual void  efg(); // _ZN3ccc6EE10x23efgEv
  virtual void  abc(); // _ZN3ccc6EE10x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE10x23pqrEv
  ~EE10x2(); // tgen
  EE10x2(); // tgen
};
//SIG(1 _ZN3ccc6EE10x2E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x23efgEv");}
void  ccc::EE10x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x23abcEv");}
void  ccc::EE10x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x23pqrEv");}
ccc::EE10x2 ::~EE10x2(){ note_dtor("_ZN3ccc6EE10x2E", this);} // tgen
ccc::EE10x2 ::EE10x2(){ note_ctor("_ZN3ccc6EE10x2E", this);} // tgen
}
static void Test__ZN3ccc6EE10x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x2E, buf);
    ::ccc::EE10x2 *dp, &lv = *(dp=new (buf) ::ccc::EE10x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x2E);
    dp->::ccc::EE10x2::~EE10x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x2E(Test__ZN3ccc6EE10x2E, "_ZN3ccc6EE10x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x2C1Ev();
extern void _ZN3ccc6EE10x2D1Ev();
Name_Map name_map__ZN3ccc6EE10x2E[] = {
  NSPAIR(_ZN3ccc6EE10x2C1Ev),
  NSPAIR(_ZN3ccc6EE10x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x2E[];
extern void _ZN3ccc6EE10x23pqrEv();
extern void _ZN3ccc6EE10x23abcEv();
extern void _ZN3ccc6EE10x23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x2E[] = {
  {&(_ZTVN3ccc6EE10x2E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x2E[];
Class_Descriptor cd__ZN3ccc6EE10x2E = {  "_ZN3ccc6EE10x2E", // class name
  bases__ZN3ccc6EE10x2E, 1,
  &(vtc__ZN3ccc6EE10x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x2E),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
namespace ccc { 
struct  EE10x3  : virtual ::ccc::AA10 {
  virtual void  efg(); // _ZN3ccc6EE10x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE10x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE10x33abcEv
  ~EE10x3(); // tgen
  EE10x3(); // tgen
};
//SIG(1 _ZN3ccc6EE10x3E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x33efgEv");}
void  ccc::EE10x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x33pqrEv");}
void  ccc::EE10x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x33abcEv");}
ccc::EE10x3 ::~EE10x3(){ note_dtor("_ZN3ccc6EE10x3E", this);} // tgen
ccc::EE10x3 ::EE10x3(){ note_ctor("_ZN3ccc6EE10x3E", this);} // tgen
}
static void Test__ZN3ccc6EE10x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x3E, buf);
    ::ccc::EE10x3 *dp, &lv = *(dp=new (buf) ::ccc::EE10x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x3E);
    dp->::ccc::EE10x3::~EE10x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x3E(Test__ZN3ccc6EE10x3E, "_ZN3ccc6EE10x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x3C1Ev();
extern void _ZN3ccc6EE10x3D1Ev();
Name_Map name_map__ZN3ccc6EE10x3E[] = {
  NSPAIR(_ZN3ccc6EE10x3C1Ev),
  NSPAIR(_ZN3ccc6EE10x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x3E[];
extern void _ZN3ccc6EE10x33pqrEv();
extern void _ZN3ccc6EE10x33abcEv();
extern void _ZN3ccc6EE10x33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x3E[] = {
  {&(_ZTVN3ccc6EE10x3E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x3E[];
Class_Descriptor cd__ZN3ccc6EE10x3E = {  "_ZN3ccc6EE10x3E", // class name
  bases__ZN3ccc6EE10x3E, 1,
  &(vtc__ZN3ccc6EE10x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x3E),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
namespace ccc { 
struct  EE10x4  : virtual ::ccc::AA10 {
  virtual void  pqr(); // _ZN3ccc6EE10x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE10x43abcEv
  virtual void  efg(); // _ZN3ccc6EE10x43efgEv
  ~EE10x4(); // tgen
  EE10x4(); // tgen
};
//SIG(1 _ZN3ccc6EE10x4E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x43pqrEv");}
void  ccc::EE10x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x43abcEv");}
void  ccc::EE10x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x43efgEv");}
ccc::EE10x4 ::~EE10x4(){ note_dtor("_ZN3ccc6EE10x4E", this);} // tgen
ccc::EE10x4 ::EE10x4(){ note_ctor("_ZN3ccc6EE10x4E", this);} // tgen
}
static void Test__ZN3ccc6EE10x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x4E, buf);
    ::ccc::EE10x4 *dp, &lv = *(dp=new (buf) ::ccc::EE10x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x4E);
    dp->::ccc::EE10x4::~EE10x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x4E(Test__ZN3ccc6EE10x4E, "_ZN3ccc6EE10x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x4C1Ev();
extern void _ZN3ccc6EE10x4D1Ev();
Name_Map name_map__ZN3ccc6EE10x4E[] = {
  NSPAIR(_ZN3ccc6EE10x4C1Ev),
  NSPAIR(_ZN3ccc6EE10x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x4E[];
extern void _ZN3ccc6EE10x43pqrEv();
extern void _ZN3ccc6EE10x43abcEv();
extern void _ZN3ccc6EE10x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x4E[] = {
  {&(_ZTVN3ccc6EE10x4E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x4E[];
Class_Descriptor cd__ZN3ccc6EE10x4E = {  "_ZN3ccc6EE10x4E", // class name
  bases__ZN3ccc6EE10x4E, 1,
  &(vtc__ZN3ccc6EE10x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x4E),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
namespace ccc { 
struct  EE10x5  : virtual ::ccc::AA10 {
  virtual void  pqr(); // _ZN3ccc6EE10x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE10x53efgEv
  virtual void  abc(); // _ZN3ccc6EE10x53abcEv
  ~EE10x5(); // tgen
  EE10x5(); // tgen
};
//SIG(1 _ZN3ccc6EE10x5E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE10x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x53pqrEv");}
void  ccc::EE10x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x53efgEv");}
void  ccc::EE10x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x53abcEv");}
ccc::EE10x5 ::~EE10x5(){ note_dtor("_ZN3ccc6EE10x5E", this);} // tgen
ccc::EE10x5 ::EE10x5(){ note_ctor("_ZN3ccc6EE10x5E", this);} // tgen
}
static void Test__ZN3ccc6EE10x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x5E, buf);
    ::ccc::EE10x5 *dp, &lv = *(dp=new (buf) ::ccc::EE10x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x5E);
    dp->::ccc::EE10x5::~EE10x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x5E(Test__ZN3ccc6EE10x5E, "_ZN3ccc6EE10x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x5C1Ev();
extern void _ZN3ccc6EE10x5D1Ev();
Name_Map name_map__ZN3ccc6EE10x5E[] = {
  NSPAIR(_ZN3ccc6EE10x5C1Ev),
  NSPAIR(_ZN3ccc6EE10x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x5E[];
extern void _ZN3ccc6EE10x53pqrEv();
extern void _ZN3ccc6EE10x53abcEv();
extern void _ZN3ccc6EE10x53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x5E[] = {
  {&(_ZTVN3ccc6EE10x5E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x5E[];
Class_Descriptor cd__ZN3ccc6EE10x5E = {  "_ZN3ccc6EE10x5E", // class name
  bases__ZN3ccc6EE10x5E, 1,
  &(vtc__ZN3ccc6EE10x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x5E),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
namespace ccc { 
struct  EE10x6  : virtual ::ccc::AA10 {
  virtual void  abc(); // _ZN3ccc6EE10x63abcEv
  virtual void  efg(); // _ZN3ccc6EE10x63efgEv
  ~EE10x6(); // tgen
  EE10x6(); // tgen
};
//SIG(1 _ZN3ccc6EE10x6E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE10x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x63abcEv");}
void  ccc::EE10x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x63efgEv");}
ccc::EE10x6 ::~EE10x6(){ note_dtor("_ZN3ccc6EE10x6E", this);} // tgen
ccc::EE10x6 ::EE10x6(){ note_ctor("_ZN3ccc6EE10x6E", this);} // tgen
}
static void Test__ZN3ccc6EE10x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x6E, buf);
    ::ccc::EE10x6 *dp, &lv = *(dp=new (buf) ::ccc::EE10x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x6E);
    dp->::ccc::EE10x6::~EE10x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x6E(Test__ZN3ccc6EE10x6E, "_ZN3ccc6EE10x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x6C1Ev();
extern void _ZN3ccc6EE10x6D1Ev();
Name_Map name_map__ZN3ccc6EE10x6E[] = {
  NSPAIR(_ZN3ccc6EE10x6C1Ev),
  NSPAIR(_ZN3ccc6EE10x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc6EE10x63abcEv();
extern void _ZN3ccc6EE10x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x6E[] = {
  {&(_ZTVN3ccc6EE10x6E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x6E[];
Class_Descriptor cd__ZN3ccc6EE10x6E = {  "_ZN3ccc6EE10x6E", // class name
  bases__ZN3ccc6EE10x6E, 1,
  &(vtc__ZN3ccc6EE10x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x6E),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
namespace ccc { 
struct  EE10x7  : virtual ::ccc::AA10 {
  virtual void  abc(); // _ZN3ccc6EE10x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE10x73pqrEv
  ~EE10x7(); // tgen
  EE10x7(); // tgen
};
//SIG(1 _ZN3ccc6EE10x7E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE10x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x73abcEv");}
void  ccc::EE10x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x73pqrEv");}
ccc::EE10x7 ::~EE10x7(){ note_dtor("_ZN3ccc6EE10x7E", this);} // tgen
ccc::EE10x7 ::EE10x7(){ note_ctor("_ZN3ccc6EE10x7E", this);} // tgen
}
static void Test__ZN3ccc6EE10x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x7E, buf);
    ::ccc::EE10x7 *dp, &lv = *(dp=new (buf) ::ccc::EE10x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x7E);
    dp->::ccc::EE10x7::~EE10x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x7E(Test__ZN3ccc6EE10x7E, "_ZN3ccc6EE10x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x7C1Ev();
extern void _ZN3ccc6EE10x7D1Ev();
Name_Map name_map__ZN3ccc6EE10x7E[] = {
  NSPAIR(_ZN3ccc6EE10x7C1Ev),
  NSPAIR(_ZN3ccc6EE10x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x7E[];
extern void _ZN3ccc6EE10x73pqrEv();
extern void _ZN3ccc6EE10x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x7E[] = {
  {&(_ZTVN3ccc6EE10x7E[5]),  5,7},
  {&(_ZTVN3ccc6EE10x7E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x7E[];
Class_Descriptor cd__ZN3ccc6EE10x7E = {  "_ZN3ccc6EE10x7E", // class name
  bases__ZN3ccc6EE10x7E, 1,
  &(vtc__ZN3ccc6EE10x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x7E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x7E),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
namespace ccc { 
struct  EE10x8  : virtual ::ccc::AA10 {
  virtual void  efg(); // _ZN3ccc6EE10x83efgEv
  virtual void  abc(); // _ZN3ccc6EE10x83abcEv
  ~EE10x8(); // tgen
  EE10x8(); // tgen
};
//SIG(1 _ZN3ccc6EE10x8E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE10x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x83efgEv");}
void  ccc::EE10x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE10x83abcEv");}
ccc::EE10x8 ::~EE10x8(){ note_dtor("_ZN3ccc6EE10x8E", this);} // tgen
ccc::EE10x8 ::EE10x8(){ note_ctor("_ZN3ccc6EE10x8E", this);} // tgen
}
static void Test__ZN3ccc6EE10x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x8E, buf);
    ::ccc::EE10x8 *dp, &lv = *(dp=new (buf) ::ccc::EE10x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x8E);
    dp->::ccc::EE10x8::~EE10x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x8E(Test__ZN3ccc6EE10x8E, "_ZN3ccc6EE10x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x8C1Ev();
extern void _ZN3ccc6EE10x8D1Ev();
Name_Map name_map__ZN3ccc6EE10x8E[] = {
  NSPAIR(_ZN3ccc6EE10x8C1Ev),
  NSPAIR(_ZN3ccc6EE10x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc6EE10x83abcEv();
extern void _ZN3ccc6EE10x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x8E[] = {
  {&(_ZTVN3ccc6EE10x8E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x8E[];
Class_Descriptor cd__ZN3ccc6EE10x8E = {  "_ZN3ccc6EE10x8E", // class name
  bases__ZN3ccc6EE10x8E, 1,
  &(vtc__ZN3ccc6EE10x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x8E),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
namespace ccc { 
struct  EE10x9  : virtual ::ccc::AA10 {
  virtual void  efg(); // _ZN3ccc6EE10x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE10x93pqrEv
  ~EE10x9(); // tgen
  EE10x9(); // tgen
};
//SIG(1 _ZN3ccc6EE10x9E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE10x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE10x93efgEv");}
void  ccc::EE10x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE10x93pqrEv");}
ccc::EE10x9 ::~EE10x9(){ note_dtor("_ZN3ccc6EE10x9E", this);} // tgen
ccc::EE10x9 ::EE10x9(){ note_ctor("_ZN3ccc6EE10x9E", this);} // tgen
}
static void Test__ZN3ccc6EE10x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE10x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE10x9E, buf);
    ::ccc::EE10x9 *dp, &lv = *(dp=new (buf) ::ccc::EE10x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE10x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE10x9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc6EE10x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE10x9E);
    dp->::ccc::EE10x9::~EE10x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE10x9E(Test__ZN3ccc6EE10x9E, "_ZN3ccc6EE10x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE10x9C1Ev();
extern void _ZN3ccc6EE10x9D1Ev();
Name_Map name_map__ZN3ccc6EE10x9E[] = {
  NSPAIR(_ZN3ccc6EE10x9C1Ev),
  NSPAIR(_ZN3ccc6EE10x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc6EE10x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE10x9E[];
extern void _ZN3ccc6EE10x93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc6EE10x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE10x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE10x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE10x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE10x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE10x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE10x9E[] = {
  {&(_ZTVN3ccc6EE10x9E[5]),  5,8},
  {&(_ZTVN3ccc6EE10x9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE10x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE10x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE10x9E[];
Class_Descriptor cd__ZN3ccc6EE10x9E = {  "_ZN3ccc6EE10x9E", // class name
  bases__ZN3ccc6EE10x9E, 1,
  &(vtc__ZN3ccc6EE10x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE10x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE10x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE10x9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE10x9E),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
namespace ccc { 
struct  EE10x10  : virtual ::ccc::AA10 {
  virtual void  pqr(); // _ZN3ccc7EE10x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE10x103abcEv
  ~EE10x10(); // tgen
  EE10x10(); // tgen
};
//SIG(1 _ZN3ccc7EE10x10E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE10x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE10x103pqrEv");}
void  ccc::EE10x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE10x103abcEv");}
ccc::EE10x10 ::~EE10x10(){ note_dtor("_ZN3ccc7EE10x10E", this);} // tgen
ccc::EE10x10 ::EE10x10(){ note_ctor("_ZN3ccc7EE10x10E", this);} // tgen
}
static void Test__ZN3ccc7EE10x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x10E, buf);
    ::ccc::EE10x10 *dp, &lv = *(dp=new (buf) ::ccc::EE10x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x10E);
    dp->::ccc::EE10x10::~EE10x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x10E(Test__ZN3ccc7EE10x10E, "_ZN3ccc7EE10x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x10C1Ev();
extern void _ZN3ccc7EE10x10D1Ev();
Name_Map name_map__ZN3ccc7EE10x10E[] = {
  NSPAIR(_ZN3ccc7EE10x10C1Ev),
  NSPAIR(_ZN3ccc7EE10x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x10E[];
extern void _ZN3ccc7EE10x103pqrEv();
extern void _ZN3ccc7EE10x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE10x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE10x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x10E[] = {
  {&(_ZTVN3ccc7EE10x10E[5]),  5,7},
  {&(_ZTVN3ccc7EE10x10E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x10E[];
Class_Descriptor cd__ZN3ccc7EE10x10E = {  "_ZN3ccc7EE10x10E", // class name
  bases__ZN3ccc7EE10x10E, 1,
  &(vtc__ZN3ccc7EE10x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x10E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x10E),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
namespace ccc { 
struct  EE10x11  : virtual ::ccc::AA10 {
  virtual void  pqr(); // _ZN3ccc7EE10x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE10x113efgEv
  ~EE10x11(); // tgen
  EE10x11(); // tgen
};
//SIG(1 _ZN3ccc7EE10x11E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE10x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE10x113pqrEv");}
void  ccc::EE10x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE10x113efgEv");}
ccc::EE10x11 ::~EE10x11(){ note_dtor("_ZN3ccc7EE10x11E", this);} // tgen
ccc::EE10x11 ::EE10x11(){ note_ctor("_ZN3ccc7EE10x11E", this);} // tgen
}
static void Test__ZN3ccc7EE10x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x11E, buf);
    ::ccc::EE10x11 *dp, &lv = *(dp=new (buf) ::ccc::EE10x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x11E);
    dp->::ccc::EE10x11::~EE10x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x11E(Test__ZN3ccc7EE10x11E, "_ZN3ccc7EE10x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x11C1Ev();
extern void _ZN3ccc7EE10x11D1Ev();
Name_Map name_map__ZN3ccc7EE10x11E[] = {
  NSPAIR(_ZN3ccc7EE10x11C1Ev),
  NSPAIR(_ZN3ccc7EE10x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x11E[];
extern void _ZN3ccc7EE10x113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc7EE10x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE10x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE10x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x11E[] = {
  {&(_ZTVN3ccc7EE10x11E[5]),  5,8},
  {&(_ZTVN3ccc7EE10x11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x11E[];
Class_Descriptor cd__ZN3ccc7EE10x11E = {  "_ZN3ccc7EE10x11E", // class name
  bases__ZN3ccc7EE10x11E, 1,
  &(vtc__ZN3ccc7EE10x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x11E),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
namespace ccc { 
struct  EE10x12  : virtual ::ccc::AA10 {
  virtual void  abc(); // _ZN3ccc7EE10x123abcEv
  ~EE10x12(); // tgen
  EE10x12(); // tgen
};
//SIG(1 _ZN3ccc7EE10x12E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE10x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE10x123abcEv");}
ccc::EE10x12 ::~EE10x12(){ note_dtor("_ZN3ccc7EE10x12E", this);} // tgen
ccc::EE10x12 ::EE10x12(){ note_ctor("_ZN3ccc7EE10x12E", this);} // tgen
}
static void Test__ZN3ccc7EE10x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x12E, buf);
    ::ccc::EE10x12 *dp, &lv = *(dp=new (buf) ::ccc::EE10x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x12E);
    dp->::ccc::EE10x12::~EE10x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x12E(Test__ZN3ccc7EE10x12E, "_ZN3ccc7EE10x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x12C1Ev();
extern void _ZN3ccc7EE10x12D1Ev();
Name_Map name_map__ZN3ccc7EE10x12E[] = {
  NSPAIR(_ZN3ccc7EE10x12C1Ev),
  NSPAIR(_ZN3ccc7EE10x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc7EE10x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE10x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x12E[] = {
  {&(_ZTVN3ccc7EE10x12E[5]),  5,7},
  {&(_ZTVN3ccc7EE10x12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x12E[];
Class_Descriptor cd__ZN3ccc7EE10x12E = {  "_ZN3ccc7EE10x12E", // class name
  bases__ZN3ccc7EE10x12E, 1,
  &(vtc__ZN3ccc7EE10x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x12E),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
namespace ccc { 
struct  EE10x13  : virtual ::ccc::AA10 {
  virtual void  efg(); // _ZN3ccc7EE10x133efgEv
  ~EE10x13(); // tgen
  EE10x13(); // tgen
};
//SIG(1 _ZN3ccc7EE10x13E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE10x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE10x133efgEv");}
ccc::EE10x13 ::~EE10x13(){ note_dtor("_ZN3ccc7EE10x13E", this);} // tgen
ccc::EE10x13 ::EE10x13(){ note_ctor("_ZN3ccc7EE10x13E", this);} // tgen
}
static void Test__ZN3ccc7EE10x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x13E, buf);
    ::ccc::EE10x13 *dp, &lv = *(dp=new (buf) ::ccc::EE10x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x13E);
    dp->::ccc::EE10x13::~EE10x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x13E(Test__ZN3ccc7EE10x13E, "_ZN3ccc7EE10x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x13C1Ev();
extern void _ZN3ccc7EE10x13D1Ev();
Name_Map name_map__ZN3ccc7EE10x13E[] = {
  NSPAIR(_ZN3ccc7EE10x13C1Ev),
  NSPAIR(_ZN3ccc7EE10x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc7EE10x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE10x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x13E[] = {
  {&(_ZTVN3ccc7EE10x13E[5]),  5,8},
  {&(_ZTVN3ccc7EE10x13E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x13E[];
Class_Descriptor cd__ZN3ccc7EE10x13E = {  "_ZN3ccc7EE10x13E", // class name
  bases__ZN3ccc7EE10x13E, 1,
  &(vtc__ZN3ccc7EE10x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x13E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x13E),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
namespace ccc { 
struct  EE10x14  : virtual ::ccc::AA10 {
  virtual void  pqr(); // _ZN3ccc7EE10x143pqrEv
  ~EE10x14(); // tgen
  EE10x14(); // tgen
};
//SIG(1 _ZN3ccc7EE10x14E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE10x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE10x143pqrEv");}
ccc::EE10x14 ::~EE10x14(){ note_dtor("_ZN3ccc7EE10x14E", this);} // tgen
ccc::EE10x14 ::EE10x14(){ note_ctor("_ZN3ccc7EE10x14E", this);} // tgen
}
static void Test__ZN3ccc7EE10x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x14E, buf);
    ::ccc::EE10x14 *dp, &lv = *(dp=new (buf) ::ccc::EE10x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x14E);
    dp->::ccc::EE10x14::~EE10x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x14E(Test__ZN3ccc7EE10x14E, "_ZN3ccc7EE10x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x14C1Ev();
extern void _ZN3ccc7EE10x14D1Ev();
Name_Map name_map__ZN3ccc7EE10x14E[] = {
  NSPAIR(_ZN3ccc7EE10x14C1Ev),
  NSPAIR(_ZN3ccc7EE10x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x14E[];
extern void _ZN3ccc7EE10x143pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE10x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x14E[] = {
  {&(_ZTVN3ccc7EE10x14E[5]),  5,7},
  {&(_ZTVN3ccc7EE10x14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x14E[];
Class_Descriptor cd__ZN3ccc7EE10x14E = {  "_ZN3ccc7EE10x14E", // class name
  bases__ZN3ccc7EE10x14E, 1,
  &(vtc__ZN3ccc7EE10x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x14E),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
namespace ccc { 
struct  EE10x15  : virtual ::ccc::AA10 {
  ~EE10x15(); // tgen
  EE10x15(); // tgen
};
//SIG(1 _ZN3ccc7EE10x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE10x15 ::~EE10x15(){ note_dtor("_ZN3ccc7EE10x15E", this);} // tgen
ccc::EE10x15 ::EE10x15(){ note_ctor("_ZN3ccc7EE10x15E", this);} // tgen
}
static void Test__ZN3ccc7EE10x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE10x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE10x15E, buf);
    ::ccc::EE10x15 *dp, &lv = *(dp=new (buf) ::ccc::EE10x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE10x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE10x15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc7EE10x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE10x15E);
    dp->::ccc::EE10x15::~EE10x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE10x15E(Test__ZN3ccc7EE10x15E, "_ZN3ccc7EE10x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE10x15C1Ev();
extern void _ZN3ccc7EE10x15D1Ev();
Name_Map name_map__ZN3ccc7EE10x15E[] = {
  NSPAIR(_ZN3ccc7EE10x15C1Ev),
  NSPAIR(_ZN3ccc7EE10x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
static Base_Class bases__ZN3ccc7EE10x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE10x15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE10x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE10x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE10x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE10x15E[] = {
  {&(_ZTVN3ccc7EE10x15E[5]),  5,7},
  {&(_ZTVN3ccc7EE10x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE10x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE10x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE10x15E[];
Class_Descriptor cd__ZN3ccc7EE10x15E = {  "_ZN3ccc7EE10x15E", // class name
  bases__ZN3ccc7EE10x15E, 1,
  &(vtc__ZN3ccc7EE10x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE10x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE10x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE10x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE10x15E),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
namespace ccc { 
struct  AA11  {
  virtual void  pqr(); // _ZN3ccc4AA113pqrEv
  virtual void  efg(); // _ZN3ccc4AA113efgEv
  ~AA11(); // tgen
  AA11(); // tgen
};
//SIG(-1 _ZN3ccc4AA11E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::AA11 ::pqr(){vfunc_called(this, "_ZN3ccc4AA113pqrEv");}
void  ccc::AA11 ::efg(){vfunc_called(this, "_ZN3ccc4AA113efgEv");}
ccc::AA11 ::~AA11(){ note_dtor("_ZN3ccc4AA11E", this);} // tgen
ccc::AA11 ::AA11(){ note_ctor("_ZN3ccc4AA11E", this);} // tgen
}
static void Test__ZN3ccc4AA11E()
{
  extern Class_Descriptor cd__ZN3ccc4AA11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4AA11E, buf);
    ::ccc::AA11 *dp, &lv = *(dp=new (buf) ::ccc::AA11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4AA11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4AA11E)");
    test_class_info(&lv, &cd__ZN3ccc4AA11E);
    dp->::ccc::AA11::~AA11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4AA11E(Test__ZN3ccc4AA11E, "_ZN3ccc4AA11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4AA11C1Ev();
extern void _ZN3ccc4AA11D1Ev();
Name_Map name_map__ZN3ccc4AA11E[] = {
  NSPAIR(_ZN3ccc4AA11C1Ev),
  NSPAIR(_ZN3ccc4AA11D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc4AA11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4AA11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
Class_Descriptor cd__ZN3ccc4AA11E = {  "_ZN3ccc4AA11E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4AA11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4AA11E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4AA11E),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
namespace ccc { 
struct  BB11  {
  virtual void  pqr(); // _ZN3ccc4BB113pqrEv
  virtual void  efg(); // _ZN3ccc4BB113efgEv
  ~BB11(); // tgen
  BB11(); // tgen
};
//SIG(1 _ZN3ccc4BB11E) C1{ v1 v2}
}
namespace ccc { 
void  ccc::BB11 ::pqr(){vfunc_called(this, "_ZN3ccc4BB113pqrEv");}
void  ccc::BB11 ::efg(){vfunc_called(this, "_ZN3ccc4BB113efgEv");}
ccc::BB11 ::~BB11(){ note_dtor("_ZN3ccc4BB11E", this);} // tgen
ccc::BB11 ::BB11(){ note_ctor("_ZN3ccc4BB11E", this);} // tgen
}
static void Test__ZN3ccc4BB11E()
{
  extern Class_Descriptor cd__ZN3ccc4BB11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4BB11E, buf);
    ::ccc::BB11 *dp, &lv = *(dp=new (buf) ::ccc::BB11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4BB11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4BB11E)");
    test_class_info(&lv, &cd__ZN3ccc4BB11E);
    dp->::ccc::BB11::~BB11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4BB11E(Test__ZN3ccc4BB11E, "_ZN3ccc4BB11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4BB11C1Ev();
extern void _ZN3ccc4BB11D1Ev();
Name_Map name_map__ZN3ccc4BB11E[] = {
  NSPAIR(_ZN3ccc4BB11C1Ev),
  NSPAIR(_ZN3ccc4BB11D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc4BB11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4BB11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
Class_Descriptor cd__ZN3ccc4BB11E = {  "_ZN3ccc4BB11E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4BB11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4BB11E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4BB11E),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
namespace ccc { 
struct  EE11x0  : virtual ::ccc::AA11 {
  virtual void  abc(); // _ZN3ccc6EE11x03abcEv
  virtual void  efg(); // _ZN3ccc6EE11x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE11x03pqrEv
  ~EE11x0(); // tgen
  EE11x0(); // tgen
};
//SIG(1 _ZN3ccc6EE11x0E) C1{ VBC2{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x03abcEv");}
void  ccc::EE11x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x03efgEv");}
void  ccc::EE11x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x03pqrEv");}
ccc::EE11x0 ::~EE11x0(){ note_dtor("_ZN3ccc6EE11x0E", this);} // tgen
ccc::EE11x0 ::EE11x0(){ note_ctor("_ZN3ccc6EE11x0E", this);} // tgen
}
static void Test__ZN3ccc6EE11x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x0E, buf);
    ::ccc::EE11x0 *dp, &lv = *(dp=new (buf) ::ccc::EE11x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x0E);
    dp->::ccc::EE11x0::~EE11x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x0E(Test__ZN3ccc6EE11x0E, "_ZN3ccc6EE11x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x0C1Ev();
extern void _ZN3ccc6EE11x0D1Ev();
Name_Map name_map__ZN3ccc6EE11x0E[] = {
  NSPAIR(_ZN3ccc6EE11x0C1Ev),
  NSPAIR(_ZN3ccc6EE11x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x0E[];
extern void _ZN3ccc6EE11x03pqrEv();
extern void _ZN3ccc6EE11x03efgEv();
extern void _ZN3ccc6EE11x03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x0E[] = {
  {&(_ZTVN3ccc6EE11x0E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x0E[];
Class_Descriptor cd__ZN3ccc6EE11x0E = {  "_ZN3ccc6EE11x0E", // class name
  bases__ZN3ccc6EE11x0E, 1,
  &(vtc__ZN3ccc6EE11x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x0E),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
namespace ccc { 
struct  EE11x1  : virtual ::ccc::AA11 {
  virtual void  abc(); // _ZN3ccc6EE11x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE11x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE11x13efgEv
  ~EE11x1(); // tgen
  EE11x1(); // tgen
};
//SIG(1 _ZN3ccc6EE11x1E) C1{ VBC2{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x13abcEv");}
void  ccc::EE11x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x13pqrEv");}
void  ccc::EE11x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x13efgEv");}
ccc::EE11x1 ::~EE11x1(){ note_dtor("_ZN3ccc6EE11x1E", this);} // tgen
ccc::EE11x1 ::EE11x1(){ note_ctor("_ZN3ccc6EE11x1E", this);} // tgen
}
static void Test__ZN3ccc6EE11x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x1E, buf);
    ::ccc::EE11x1 *dp, &lv = *(dp=new (buf) ::ccc::EE11x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x1E);
    dp->::ccc::EE11x1::~EE11x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x1E(Test__ZN3ccc6EE11x1E, "_ZN3ccc6EE11x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x1C1Ev();
extern void _ZN3ccc6EE11x1D1Ev();
Name_Map name_map__ZN3ccc6EE11x1E[] = {
  NSPAIR(_ZN3ccc6EE11x1C1Ev),
  NSPAIR(_ZN3ccc6EE11x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x1E[];
extern void _ZN3ccc6EE11x13pqrEv();
extern void _ZN3ccc6EE11x13efgEv();
extern void _ZN3ccc6EE11x13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x1E[] = {
  {&(_ZTVN3ccc6EE11x1E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x1E[];
Class_Descriptor cd__ZN3ccc6EE11x1E = {  "_ZN3ccc6EE11x1E", // class name
  bases__ZN3ccc6EE11x1E, 1,
  &(vtc__ZN3ccc6EE11x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x1E),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
namespace ccc { 
struct  EE11x2  : virtual ::ccc::AA11 {
  virtual void  efg(); // _ZN3ccc6EE11x23efgEv
  virtual void  abc(); // _ZN3ccc6EE11x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE11x23pqrEv
  ~EE11x2(); // tgen
  EE11x2(); // tgen
};
//SIG(1 _ZN3ccc6EE11x2E) C1{ VBC2{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x23efgEv");}
void  ccc::EE11x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x23abcEv");}
void  ccc::EE11x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x23pqrEv");}
ccc::EE11x2 ::~EE11x2(){ note_dtor("_ZN3ccc6EE11x2E", this);} // tgen
ccc::EE11x2 ::EE11x2(){ note_ctor("_ZN3ccc6EE11x2E", this);} // tgen
}
static void Test__ZN3ccc6EE11x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x2E, buf);
    ::ccc::EE11x2 *dp, &lv = *(dp=new (buf) ::ccc::EE11x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x2E);
    dp->::ccc::EE11x2::~EE11x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x2E(Test__ZN3ccc6EE11x2E, "_ZN3ccc6EE11x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x2C1Ev();
extern void _ZN3ccc6EE11x2D1Ev();
Name_Map name_map__ZN3ccc6EE11x2E[] = {
  NSPAIR(_ZN3ccc6EE11x2C1Ev),
  NSPAIR(_ZN3ccc6EE11x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x2E[];
extern void _ZN3ccc6EE11x23pqrEv();
extern void _ZN3ccc6EE11x23efgEv();
extern void _ZN3ccc6EE11x23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x2E[] = {
  {&(_ZTVN3ccc6EE11x2E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x2E[];
Class_Descriptor cd__ZN3ccc6EE11x2E = {  "_ZN3ccc6EE11x2E", // class name
  bases__ZN3ccc6EE11x2E, 1,
  &(vtc__ZN3ccc6EE11x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x2E),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
namespace ccc { 
struct  EE11x3  : virtual ::ccc::AA11 {
  virtual void  efg(); // _ZN3ccc6EE11x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE11x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE11x33abcEv
  ~EE11x3(); // tgen
  EE11x3(); // tgen
};
//SIG(1 _ZN3ccc6EE11x3E) C1{ VBC2{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x33efgEv");}
void  ccc::EE11x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x33pqrEv");}
void  ccc::EE11x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x33abcEv");}
ccc::EE11x3 ::~EE11x3(){ note_dtor("_ZN3ccc6EE11x3E", this);} // tgen
ccc::EE11x3 ::EE11x3(){ note_ctor("_ZN3ccc6EE11x3E", this);} // tgen
}
static void Test__ZN3ccc6EE11x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x3E, buf);
    ::ccc::EE11x3 *dp, &lv = *(dp=new (buf) ::ccc::EE11x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x3E);
    dp->::ccc::EE11x3::~EE11x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x3E(Test__ZN3ccc6EE11x3E, "_ZN3ccc6EE11x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x3C1Ev();
extern void _ZN3ccc6EE11x3D1Ev();
Name_Map name_map__ZN3ccc6EE11x3E[] = {
  NSPAIR(_ZN3ccc6EE11x3C1Ev),
  NSPAIR(_ZN3ccc6EE11x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x3E[];
extern void _ZN3ccc6EE11x33pqrEv();
extern void _ZN3ccc6EE11x33efgEv();
extern void _ZN3ccc6EE11x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x3E[] = {
  {&(_ZTVN3ccc6EE11x3E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x3E[];
Class_Descriptor cd__ZN3ccc6EE11x3E = {  "_ZN3ccc6EE11x3E", // class name
  bases__ZN3ccc6EE11x3E, 1,
  &(vtc__ZN3ccc6EE11x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x3E),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
namespace ccc { 
struct  EE11x4  : virtual ::ccc::AA11 {
  virtual void  pqr(); // _ZN3ccc6EE11x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE11x43abcEv
  virtual void  efg(); // _ZN3ccc6EE11x43efgEv
  ~EE11x4(); // tgen
  EE11x4(); // tgen
};
//SIG(1 _ZN3ccc6EE11x4E) C1{ VBC2{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x43pqrEv");}
void  ccc::EE11x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x43abcEv");}
void  ccc::EE11x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x43efgEv");}
ccc::EE11x4 ::~EE11x4(){ note_dtor("_ZN3ccc6EE11x4E", this);} // tgen
ccc::EE11x4 ::EE11x4(){ note_ctor("_ZN3ccc6EE11x4E", this);} // tgen
}
static void Test__ZN3ccc6EE11x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x4E, buf);
    ::ccc::EE11x4 *dp, &lv = *(dp=new (buf) ::ccc::EE11x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x4E);
    dp->::ccc::EE11x4::~EE11x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x4E(Test__ZN3ccc6EE11x4E, "_ZN3ccc6EE11x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x4C1Ev();
extern void _ZN3ccc6EE11x4D1Ev();
Name_Map name_map__ZN3ccc6EE11x4E[] = {
  NSPAIR(_ZN3ccc6EE11x4C1Ev),
  NSPAIR(_ZN3ccc6EE11x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x4E[];
extern void _ZN3ccc6EE11x43pqrEv();
extern void _ZN3ccc6EE11x43efgEv();
extern void _ZN3ccc6EE11x43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x4E[] = {
  {&(_ZTVN3ccc6EE11x4E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x4E[];
Class_Descriptor cd__ZN3ccc6EE11x4E = {  "_ZN3ccc6EE11x4E", // class name
  bases__ZN3ccc6EE11x4E, 1,
  &(vtc__ZN3ccc6EE11x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x4E),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
namespace ccc { 
struct  EE11x5  : virtual ::ccc::AA11 {
  virtual void  pqr(); // _ZN3ccc6EE11x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE11x53efgEv
  virtual void  abc(); // _ZN3ccc6EE11x53abcEv
  ~EE11x5(); // tgen
  EE11x5(); // tgen
};
//SIG(1 _ZN3ccc6EE11x5E) C1{ VBC2{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE11x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x53pqrEv");}
void  ccc::EE11x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x53efgEv");}
void  ccc::EE11x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x53abcEv");}
ccc::EE11x5 ::~EE11x5(){ note_dtor("_ZN3ccc6EE11x5E", this);} // tgen
ccc::EE11x5 ::EE11x5(){ note_ctor("_ZN3ccc6EE11x5E", this);} // tgen
}
static void Test__ZN3ccc6EE11x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x5E, buf);
    ::ccc::EE11x5 *dp, &lv = *(dp=new (buf) ::ccc::EE11x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x5E);
    dp->::ccc::EE11x5::~EE11x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x5E(Test__ZN3ccc6EE11x5E, "_ZN3ccc6EE11x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x5C1Ev();
extern void _ZN3ccc6EE11x5D1Ev();
Name_Map name_map__ZN3ccc6EE11x5E[] = {
  NSPAIR(_ZN3ccc6EE11x5C1Ev),
  NSPAIR(_ZN3ccc6EE11x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x5E[];
extern void _ZN3ccc6EE11x53pqrEv();
extern void _ZN3ccc6EE11x53efgEv();
extern void _ZN3ccc6EE11x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x5E[] = {
  {&(_ZTVN3ccc6EE11x5E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x5E[];
Class_Descriptor cd__ZN3ccc6EE11x5E = {  "_ZN3ccc6EE11x5E", // class name
  bases__ZN3ccc6EE11x5E, 1,
  &(vtc__ZN3ccc6EE11x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x5E),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
namespace ccc { 
struct  EE11x6  : virtual ::ccc::AA11 {
  virtual void  abc(); // _ZN3ccc6EE11x63abcEv
  virtual void  efg(); // _ZN3ccc6EE11x63efgEv
  ~EE11x6(); // tgen
  EE11x6(); // tgen
};
//SIG(1 _ZN3ccc6EE11x6E) C1{ VBC2{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE11x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x63abcEv");}
void  ccc::EE11x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x63efgEv");}
ccc::EE11x6 ::~EE11x6(){ note_dtor("_ZN3ccc6EE11x6E", this);} // tgen
ccc::EE11x6 ::EE11x6(){ note_ctor("_ZN3ccc6EE11x6E", this);} // tgen
}
static void Test__ZN3ccc6EE11x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x6E, buf);
    ::ccc::EE11x6 *dp, &lv = *(dp=new (buf) ::ccc::EE11x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x6E);
    dp->::ccc::EE11x6::~EE11x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x6E(Test__ZN3ccc6EE11x6E, "_ZN3ccc6EE11x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x6C1Ev();
extern void _ZN3ccc6EE11x6D1Ev();
Name_Map name_map__ZN3ccc6EE11x6E[] = {
  NSPAIR(_ZN3ccc6EE11x6C1Ev),
  NSPAIR(_ZN3ccc6EE11x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc6EE11x63efgEv();
extern void _ZN3ccc6EE11x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x6E[] = {
  {&(_ZTVN3ccc6EE11x6E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x6E[];
Class_Descriptor cd__ZN3ccc6EE11x6E = {  "_ZN3ccc6EE11x6E", // class name
  bases__ZN3ccc6EE11x6E, 1,
  &(vtc__ZN3ccc6EE11x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x6E),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
namespace ccc { 
struct  EE11x7  : virtual ::ccc::AA11 {
  virtual void  abc(); // _ZN3ccc6EE11x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE11x73pqrEv
  ~EE11x7(); // tgen
  EE11x7(); // tgen
};
//SIG(1 _ZN3ccc6EE11x7E) C1{ VBC2{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE11x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x73abcEv");}
void  ccc::EE11x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x73pqrEv");}
ccc::EE11x7 ::~EE11x7(){ note_dtor("_ZN3ccc6EE11x7E", this);} // tgen
ccc::EE11x7 ::EE11x7(){ note_ctor("_ZN3ccc6EE11x7E", this);} // tgen
}
static void Test__ZN3ccc6EE11x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x7E, buf);
    ::ccc::EE11x7 *dp, &lv = *(dp=new (buf) ::ccc::EE11x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x7E);
    dp->::ccc::EE11x7::~EE11x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x7E(Test__ZN3ccc6EE11x7E, "_ZN3ccc6EE11x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x7C1Ev();
extern void _ZN3ccc6EE11x7D1Ev();
Name_Map name_map__ZN3ccc6EE11x7E[] = {
  NSPAIR(_ZN3ccc6EE11x7C1Ev),
  NSPAIR(_ZN3ccc6EE11x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x7E[];
extern void _ZN3ccc6EE11x73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc6EE11x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x7E[] = {
  {&(_ZTVN3ccc6EE11x7E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x7E[];
Class_Descriptor cd__ZN3ccc6EE11x7E = {  "_ZN3ccc6EE11x7E", // class name
  bases__ZN3ccc6EE11x7E, 1,
  &(vtc__ZN3ccc6EE11x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x7E),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
namespace ccc { 
struct  EE11x8  : virtual ::ccc::AA11 {
  virtual void  efg(); // _ZN3ccc6EE11x83efgEv
  virtual void  abc(); // _ZN3ccc6EE11x83abcEv
  ~EE11x8(); // tgen
  EE11x8(); // tgen
};
//SIG(1 _ZN3ccc6EE11x8E) C1{ VBC2{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE11x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x83efgEv");}
void  ccc::EE11x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE11x83abcEv");}
ccc::EE11x8 ::~EE11x8(){ note_dtor("_ZN3ccc6EE11x8E", this);} // tgen
ccc::EE11x8 ::EE11x8(){ note_ctor("_ZN3ccc6EE11x8E", this);} // tgen
}
static void Test__ZN3ccc6EE11x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x8E, buf);
    ::ccc::EE11x8 *dp, &lv = *(dp=new (buf) ::ccc::EE11x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x8E);
    dp->::ccc::EE11x8::~EE11x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x8E(Test__ZN3ccc6EE11x8E, "_ZN3ccc6EE11x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x8C1Ev();
extern void _ZN3ccc6EE11x8D1Ev();
Name_Map name_map__ZN3ccc6EE11x8E[] = {
  NSPAIR(_ZN3ccc6EE11x8C1Ev),
  NSPAIR(_ZN3ccc6EE11x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc6EE11x83efgEv();
extern void _ZN3ccc6EE11x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x8E[] = {
  {&(_ZTVN3ccc6EE11x8E[5]),  5,8},
  {&(_ZTVN3ccc6EE11x8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x8E[];
Class_Descriptor cd__ZN3ccc6EE11x8E = {  "_ZN3ccc6EE11x8E", // class name
  bases__ZN3ccc6EE11x8E, 1,
  &(vtc__ZN3ccc6EE11x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x8E),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
namespace ccc { 
struct  EE11x9  : virtual ::ccc::AA11 {
  virtual void  efg(); // _ZN3ccc6EE11x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE11x93pqrEv
  ~EE11x9(); // tgen
  EE11x9(); // tgen
};
//SIG(1 _ZN3ccc6EE11x9E) C1{ VBC2{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::EE11x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE11x93efgEv");}
void  ccc::EE11x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE11x93pqrEv");}
ccc::EE11x9 ::~EE11x9(){ note_dtor("_ZN3ccc6EE11x9E", this);} // tgen
ccc::EE11x9 ::EE11x9(){ note_ctor("_ZN3ccc6EE11x9E", this);} // tgen
}
static void Test__ZN3ccc6EE11x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE11x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE11x9E, buf);
    ::ccc::EE11x9 *dp, &lv = *(dp=new (buf) ::ccc::EE11x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE11x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE11x9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc6EE11x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE11x9E);
    dp->::ccc::EE11x9::~EE11x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE11x9E(Test__ZN3ccc6EE11x9E, "_ZN3ccc6EE11x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE11x9C1Ev();
extern void _ZN3ccc6EE11x9D1Ev();
Name_Map name_map__ZN3ccc6EE11x9E[] = {
  NSPAIR(_ZN3ccc6EE11x9C1Ev),
  NSPAIR(_ZN3ccc6EE11x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc6EE11x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE11x9E[];
extern void _ZN3ccc6EE11x93pqrEv();
extern void _ZN3ccc6EE11x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE11x9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE11x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE11x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE11x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE11x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE11x9E[] = {
  {&(_ZTVN3ccc6EE11x9E[5]),  5,7},
  {&(_ZTVN3ccc6EE11x9E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE11x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE11x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE11x9E[];
Class_Descriptor cd__ZN3ccc6EE11x9E = {  "_ZN3ccc6EE11x9E", // class name
  bases__ZN3ccc6EE11x9E, 1,
  &(vtc__ZN3ccc6EE11x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE11x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE11x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE11x9E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE11x9E),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
namespace ccc { 
struct  EE11x10  : virtual ::ccc::AA11 {
  virtual void  pqr(); // _ZN3ccc7EE11x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE11x103abcEv
  ~EE11x10(); // tgen
  EE11x10(); // tgen
};
//SIG(1 _ZN3ccc7EE11x10E) C1{ VBC2{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::EE11x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE11x103pqrEv");}
void  ccc::EE11x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE11x103abcEv");}
ccc::EE11x10 ::~EE11x10(){ note_dtor("_ZN3ccc7EE11x10E", this);} // tgen
ccc::EE11x10 ::EE11x10(){ note_ctor("_ZN3ccc7EE11x10E", this);} // tgen
}
static void Test__ZN3ccc7EE11x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x10E, buf);
    ::ccc::EE11x10 *dp, &lv = *(dp=new (buf) ::ccc::EE11x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x10E);
    dp->::ccc::EE11x10::~EE11x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x10E(Test__ZN3ccc7EE11x10E, "_ZN3ccc7EE11x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x10C1Ev();
extern void _ZN3ccc7EE11x10D1Ev();
Name_Map name_map__ZN3ccc7EE11x10E[] = {
  NSPAIR(_ZN3ccc7EE11x10C1Ev),
  NSPAIR(_ZN3ccc7EE11x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x10E[];
extern void _ZN3ccc7EE11x103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc7EE11x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE11x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE11x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x10E[] = {
  {&(_ZTVN3ccc7EE11x10E[5]),  5,8},
  {&(_ZTVN3ccc7EE11x10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x10E[];
Class_Descriptor cd__ZN3ccc7EE11x10E = {  "_ZN3ccc7EE11x10E", // class name
  bases__ZN3ccc7EE11x10E, 1,
  &(vtc__ZN3ccc7EE11x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x10E),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
namespace ccc { 
struct  EE11x11  : virtual ::ccc::AA11 {
  virtual void  pqr(); // _ZN3ccc7EE11x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE11x113efgEv
  ~EE11x11(); // tgen
  EE11x11(); // tgen
};
//SIG(1 _ZN3ccc7EE11x11E) C1{ VBC2{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::EE11x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE11x113pqrEv");}
void  ccc::EE11x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE11x113efgEv");}
ccc::EE11x11 ::~EE11x11(){ note_dtor("_ZN3ccc7EE11x11E", this);} // tgen
ccc::EE11x11 ::EE11x11(){ note_ctor("_ZN3ccc7EE11x11E", this);} // tgen
}
static void Test__ZN3ccc7EE11x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x11E, buf);
    ::ccc::EE11x11 *dp, &lv = *(dp=new (buf) ::ccc::EE11x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x11E);
    dp->::ccc::EE11x11::~EE11x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x11E(Test__ZN3ccc7EE11x11E, "_ZN3ccc7EE11x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x11C1Ev();
extern void _ZN3ccc7EE11x11D1Ev();
Name_Map name_map__ZN3ccc7EE11x11E[] = {
  NSPAIR(_ZN3ccc7EE11x11C1Ev),
  NSPAIR(_ZN3ccc7EE11x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x11E[];
extern void _ZN3ccc7EE11x113pqrEv();
extern void _ZN3ccc7EE11x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE11x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE11x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x11E[] = {
  {&(_ZTVN3ccc7EE11x11E[5]),  5,7},
  {&(_ZTVN3ccc7EE11x11E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x11E[];
Class_Descriptor cd__ZN3ccc7EE11x11E = {  "_ZN3ccc7EE11x11E", // class name
  bases__ZN3ccc7EE11x11E, 1,
  &(vtc__ZN3ccc7EE11x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x11E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x11E),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
namespace ccc { 
struct  EE11x12  : virtual ::ccc::AA11 {
  virtual void  abc(); // _ZN3ccc7EE11x123abcEv
  ~EE11x12(); // tgen
  EE11x12(); // tgen
};
//SIG(1 _ZN3ccc7EE11x12E) C1{ VBC2{ v2 v3} v1}
}
namespace ccc { 
void  ccc::EE11x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE11x123abcEv");}
ccc::EE11x12 ::~EE11x12(){ note_dtor("_ZN3ccc7EE11x12E", this);} // tgen
ccc::EE11x12 ::EE11x12(){ note_ctor("_ZN3ccc7EE11x12E", this);} // tgen
}
static void Test__ZN3ccc7EE11x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x12E, buf);
    ::ccc::EE11x12 *dp, &lv = *(dp=new (buf) ::ccc::EE11x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x12E);
    dp->::ccc::EE11x12::~EE11x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x12E(Test__ZN3ccc7EE11x12E, "_ZN3ccc7EE11x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x12C1Ev();
extern void _ZN3ccc7EE11x12D1Ev();
Name_Map name_map__ZN3ccc7EE11x12E[] = {
  NSPAIR(_ZN3ccc7EE11x12C1Ev),
  NSPAIR(_ZN3ccc7EE11x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc7EE11x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE11x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x12E[] = {
  {&(_ZTVN3ccc7EE11x12E[5]),  5,8},
  {&(_ZTVN3ccc7EE11x12E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x12E[];
Class_Descriptor cd__ZN3ccc7EE11x12E = {  "_ZN3ccc7EE11x12E", // class name
  bases__ZN3ccc7EE11x12E, 1,
  &(vtc__ZN3ccc7EE11x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x12E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x12E),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
namespace ccc { 
struct  EE11x13  : virtual ::ccc::AA11 {
  virtual void  efg(); // _ZN3ccc7EE11x133efgEv
  ~EE11x13(); // tgen
  EE11x13(); // tgen
};
//SIG(1 _ZN3ccc7EE11x13E) C1{ VBC2{ v2 v1} v1}
}
namespace ccc { 
void  ccc::EE11x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE11x133efgEv");}
ccc::EE11x13 ::~EE11x13(){ note_dtor("_ZN3ccc7EE11x13E", this);} // tgen
ccc::EE11x13 ::EE11x13(){ note_ctor("_ZN3ccc7EE11x13E", this);} // tgen
}
static void Test__ZN3ccc7EE11x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x13E, buf);
    ::ccc::EE11x13 *dp, &lv = *(dp=new (buf) ::ccc::EE11x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x13E);
    dp->::ccc::EE11x13::~EE11x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x13E(Test__ZN3ccc7EE11x13E, "_ZN3ccc7EE11x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x13C1Ev();
extern void _ZN3ccc7EE11x13D1Ev();
Name_Map name_map__ZN3ccc7EE11x13E[] = {
  NSPAIR(_ZN3ccc7EE11x13C1Ev),
  NSPAIR(_ZN3ccc7EE11x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc7EE11x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE11x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x13E[] = {
  {&(_ZTVN3ccc7EE11x13E[5]),  5,7},
  {&(_ZTVN3ccc7EE11x13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x13E[];
Class_Descriptor cd__ZN3ccc7EE11x13E = {  "_ZN3ccc7EE11x13E", // class name
  bases__ZN3ccc7EE11x13E, 1,
  &(vtc__ZN3ccc7EE11x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x13E),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
namespace ccc { 
struct  EE11x14  : virtual ::ccc::AA11 {
  virtual void  pqr(); // _ZN3ccc7EE11x143pqrEv
  ~EE11x14(); // tgen
  EE11x14(); // tgen
};
//SIG(1 _ZN3ccc7EE11x14E) C1{ VBC2{ v1 v2} v1}
}
namespace ccc { 
void  ccc::EE11x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE11x143pqrEv");}
ccc::EE11x14 ::~EE11x14(){ note_dtor("_ZN3ccc7EE11x14E", this);} // tgen
ccc::EE11x14 ::EE11x14(){ note_ctor("_ZN3ccc7EE11x14E", this);} // tgen
}
static void Test__ZN3ccc7EE11x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x14E, buf);
    ::ccc::EE11x14 *dp, &lv = *(dp=new (buf) ::ccc::EE11x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x14E);
    dp->::ccc::EE11x14::~EE11x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x14E(Test__ZN3ccc7EE11x14E, "_ZN3ccc7EE11x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x14C1Ev();
extern void _ZN3ccc7EE11x14D1Ev();
Name_Map name_map__ZN3ccc7EE11x14E[] = {
  NSPAIR(_ZN3ccc7EE11x14C1Ev),
  NSPAIR(_ZN3ccc7EE11x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x14E[];
extern void _ZN3ccc7EE11x143pqrEv();
extern void _ZN3ccc4AA113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE11x143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x14E[] = {
  {&(_ZTVN3ccc7EE11x14E[5]),  5,7},
  {&(_ZTVN3ccc7EE11x14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x14E[];
Class_Descriptor cd__ZN3ccc7EE11x14E = {  "_ZN3ccc7EE11x14E", // class name
  bases__ZN3ccc7EE11x14E, 1,
  &(vtc__ZN3ccc7EE11x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x14E),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
namespace ccc { 
struct  EE11x15  : virtual ::ccc::AA11 {
  ~EE11x15(); // tgen
  EE11x15(); // tgen
};
//SIG(1 _ZN3ccc7EE11x15E) C1{ VBC2{ v1 v2}}
}
namespace ccc { 
ccc::EE11x15 ::~EE11x15(){ note_dtor("_ZN3ccc7EE11x15E", this);} // tgen
ccc::EE11x15 ::EE11x15(){ note_ctor("_ZN3ccc7EE11x15E", this);} // tgen
}
static void Test__ZN3ccc7EE11x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE11x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE11x15E, buf);
    ::ccc::EE11x15 *dp, &lv = *(dp=new (buf) ::ccc::EE11x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE11x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE11x15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc7EE11x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE11x15E);
    dp->::ccc::EE11x15::~EE11x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE11x15E(Test__ZN3ccc7EE11x15E, "_ZN3ccc7EE11x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE11x15C1Ev();
extern void _ZN3ccc7EE11x15D1Ev();
Name_Map name_map__ZN3ccc7EE11x15E[] = {
  NSPAIR(_ZN3ccc7EE11x15C1Ev),
  NSPAIR(_ZN3ccc7EE11x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
static Base_Class bases__ZN3ccc7EE11x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //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
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE11x15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE11x15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE11x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE11x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE11x15E[] = {
  {&(_ZTVN3ccc7EE11x15E[5]),  5,7},
  {&(_ZTVN3ccc7EE11x15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE11x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE11x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE11x15E[];
Class_Descriptor cd__ZN3ccc7EE11x15E = {  "_ZN3ccc7EE11x15E", // class name
  bases__ZN3ccc7EE11x15E, 1,
  &(vtc__ZN3ccc7EE11x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE11x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE11x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE11x15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE11x15E),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
namespace ccc { 
struct  AA12  {
  virtual void  abc(); // _ZN3ccc4AA123abcEv
  ~AA12(); // tgen
  AA12(); // tgen
};
//SIG(-1 _ZN3ccc4AA12E) C1{ v1}
}
namespace ccc { 
void  ccc::AA12 ::abc(){vfunc_called(this, "_ZN3ccc4AA123abcEv");}
ccc::AA12 ::~AA12(){ note_dtor("_ZN3ccc4AA12E", this);} // tgen
ccc::AA12 ::AA12(){ note_ctor("_ZN3ccc4AA12E", this);} // tgen
}
static void Test__ZN3ccc4AA12E()
{
  extern Class_Descriptor cd__ZN3ccc4AA12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4AA12E, buf);
    ::ccc::AA12 *dp, &lv = *(dp=new (buf) ::ccc::AA12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4AA12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4AA12E)");
    test_class_info(&lv, &cd__ZN3ccc4AA12E);
    dp->::ccc::AA12::~AA12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4AA12E(Test__ZN3ccc4AA12E, "_ZN3ccc4AA12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4AA12C1Ev();
extern void _ZN3ccc4AA12D1Ev();
Name_Map name_map__ZN3ccc4AA12E[] = {
  NSPAIR(_ZN3ccc4AA12C1Ev),
  NSPAIR(_ZN3ccc4AA12D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern void _ZN3ccc4AA123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc4AA12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4AA12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
Class_Descriptor cd__ZN3ccc4AA12E = {  "_ZN3ccc4AA12E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4AA12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4AA12E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4AA12E),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
namespace ccc { 
struct  BB12  {
  virtual void  abc(); // _ZN3ccc4BB123abcEv
  ~BB12(); // tgen
  BB12(); // tgen
};
//SIG(1 _ZN3ccc4BB12E) C1{ v1}
}
namespace ccc { 
void  ccc::BB12 ::abc(){vfunc_called(this, "_ZN3ccc4BB123abcEv");}
ccc::BB12 ::~BB12(){ note_dtor("_ZN3ccc4BB12E", this);} // tgen
ccc::BB12 ::BB12(){ note_ctor("_ZN3ccc4BB12E", this);} // tgen
}
static void Test__ZN3ccc4BB12E()
{
  extern Class_Descriptor cd__ZN3ccc4BB12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4BB12E, buf);
    ::ccc::BB12 *dp, &lv = *(dp=new (buf) ::ccc::BB12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4BB12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4BB12E)");
    test_class_info(&lv, &cd__ZN3ccc4BB12E);
    dp->::ccc::BB12::~BB12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4BB12E(Test__ZN3ccc4BB12E, "_ZN3ccc4BB12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4BB12C1Ev();
extern void _ZN3ccc4BB12D1Ev();
Name_Map name_map__ZN3ccc4BB12E[] = {
  NSPAIR(_ZN3ccc4BB12C1Ev),
  NSPAIR(_ZN3ccc4BB12D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc4BB12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4BB12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
Class_Descriptor cd__ZN3ccc4BB12E = {  "_ZN3ccc4BB12E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4BB12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4BB12E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4BB12E),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
namespace ccc { 
struct  EE12x0  : virtual ::ccc::AA12 {
  virtual void  abc(); // _ZN3ccc6EE12x03abcEv
  virtual void  efg(); // _ZN3ccc6EE12x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE12x03pqrEv
  ~EE12x0(); // tgen
  EE12x0(); // tgen
};
//SIG(1 _ZN3ccc6EE12x0E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x03abcEv");}
void  ccc::EE12x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x03efgEv");}
void  ccc::EE12x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x03pqrEv");}
ccc::EE12x0 ::~EE12x0(){ note_dtor("_ZN3ccc6EE12x0E", this);} // tgen
ccc::EE12x0 ::EE12x0(){ note_ctor("_ZN3ccc6EE12x0E", this);} // tgen
}
static void Test__ZN3ccc6EE12x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x0E, buf);
    ::ccc::EE12x0 *dp, &lv = *(dp=new (buf) ::ccc::EE12x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x0E);
    dp->::ccc::EE12x0::~EE12x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x0E(Test__ZN3ccc6EE12x0E, "_ZN3ccc6EE12x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x0C1Ev();
extern void _ZN3ccc6EE12x0D1Ev();
Name_Map name_map__ZN3ccc6EE12x0E[] = {
  NSPAIR(_ZN3ccc6EE12x0C1Ev),
  NSPAIR(_ZN3ccc6EE12x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x0E[];
extern void _ZN3ccc6EE12x03abcEv();
extern void _ZN3ccc6EE12x03efgEv();
extern void _ZN3ccc6EE12x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x0E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x0E[] = {
  {&(_ZTVN3ccc6EE12x0E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x0E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x0E[];
Class_Descriptor cd__ZN3ccc6EE12x0E = {  "_ZN3ccc6EE12x0E", // class name
  bases__ZN3ccc6EE12x0E, 1,
  &(vtc__ZN3ccc6EE12x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x0E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x0E),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
namespace ccc { 
struct  EE12x1  : virtual ::ccc::AA12 {
  virtual void  abc(); // _ZN3ccc6EE12x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE12x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE12x13efgEv
  ~EE12x1(); // tgen
  EE12x1(); // tgen
};
//SIG(1 _ZN3ccc6EE12x1E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x13abcEv");}
void  ccc::EE12x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x13pqrEv");}
void  ccc::EE12x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x13efgEv");}
ccc::EE12x1 ::~EE12x1(){ note_dtor("_ZN3ccc6EE12x1E", this);} // tgen
ccc::EE12x1 ::EE12x1(){ note_ctor("_ZN3ccc6EE12x1E", this);} // tgen
}
static void Test__ZN3ccc6EE12x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x1E, buf);
    ::ccc::EE12x1 *dp, &lv = *(dp=new (buf) ::ccc::EE12x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x1E);
    dp->::ccc::EE12x1::~EE12x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x1E(Test__ZN3ccc6EE12x1E, "_ZN3ccc6EE12x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x1C1Ev();
extern void _ZN3ccc6EE12x1D1Ev();
Name_Map name_map__ZN3ccc6EE12x1E[] = {
  NSPAIR(_ZN3ccc6EE12x1C1Ev),
  NSPAIR(_ZN3ccc6EE12x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x1E[];
extern void _ZN3ccc6EE12x13abcEv();
extern void _ZN3ccc6EE12x13pqrEv();
extern void _ZN3ccc6EE12x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x1E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x1E[] = {
  {&(_ZTVN3ccc6EE12x1E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x1E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x1E[];
Class_Descriptor cd__ZN3ccc6EE12x1E = {  "_ZN3ccc6EE12x1E", // class name
  bases__ZN3ccc6EE12x1E, 1,
  &(vtc__ZN3ccc6EE12x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x1E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x1E),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
namespace ccc { 
struct  EE12x2  : virtual ::ccc::AA12 {
  virtual void  efg(); // _ZN3ccc6EE12x23efgEv
  virtual void  abc(); // _ZN3ccc6EE12x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE12x23pqrEv
  ~EE12x2(); // tgen
  EE12x2(); // tgen
};
//SIG(1 _ZN3ccc6EE12x2E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x23efgEv");}
void  ccc::EE12x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x23abcEv");}
void  ccc::EE12x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x23pqrEv");}
ccc::EE12x2 ::~EE12x2(){ note_dtor("_ZN3ccc6EE12x2E", this);} // tgen
ccc::EE12x2 ::EE12x2(){ note_ctor("_ZN3ccc6EE12x2E", this);} // tgen
}
static void Test__ZN3ccc6EE12x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x2E, buf);
    ::ccc::EE12x2 *dp, &lv = *(dp=new (buf) ::ccc::EE12x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x2E);
    dp->::ccc::EE12x2::~EE12x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x2E(Test__ZN3ccc6EE12x2E, "_ZN3ccc6EE12x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x2C1Ev();
extern void _ZN3ccc6EE12x2D1Ev();
Name_Map name_map__ZN3ccc6EE12x2E[] = {
  NSPAIR(_ZN3ccc6EE12x2C1Ev),
  NSPAIR(_ZN3ccc6EE12x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x2E[];
extern void _ZN3ccc6EE12x23abcEv();
extern void _ZN3ccc6EE12x23efgEv();
extern void _ZN3ccc6EE12x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x2E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x2E[] = {
  {&(_ZTVN3ccc6EE12x2E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x2E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x2E[];
Class_Descriptor cd__ZN3ccc6EE12x2E = {  "_ZN3ccc6EE12x2E", // class name
  bases__ZN3ccc6EE12x2E, 1,
  &(vtc__ZN3ccc6EE12x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x2E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x2E),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
namespace ccc { 
struct  EE12x3  : virtual ::ccc::AA12 {
  virtual void  efg(); // _ZN3ccc6EE12x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE12x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE12x33abcEv
  ~EE12x3(); // tgen
  EE12x3(); // tgen
};
//SIG(1 _ZN3ccc6EE12x3E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x33efgEv");}
void  ccc::EE12x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x33pqrEv");}
void  ccc::EE12x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x33abcEv");}
ccc::EE12x3 ::~EE12x3(){ note_dtor("_ZN3ccc6EE12x3E", this);} // tgen
ccc::EE12x3 ::EE12x3(){ note_ctor("_ZN3ccc6EE12x3E", this);} // tgen
}
static void Test__ZN3ccc6EE12x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x3E, buf);
    ::ccc::EE12x3 *dp, &lv = *(dp=new (buf) ::ccc::EE12x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x3E);
    dp->::ccc::EE12x3::~EE12x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x3E(Test__ZN3ccc6EE12x3E, "_ZN3ccc6EE12x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x3C1Ev();
extern void _ZN3ccc6EE12x3D1Ev();
Name_Map name_map__ZN3ccc6EE12x3E[] = {
  NSPAIR(_ZN3ccc6EE12x3C1Ev),
  NSPAIR(_ZN3ccc6EE12x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x3E[];
extern void _ZN3ccc6EE12x33abcEv();
extern void _ZN3ccc6EE12x33efgEv();
extern void _ZN3ccc6EE12x33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x3E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x33abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x3E[] = {
  {&(_ZTVN3ccc6EE12x3E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x3E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x3E[];
Class_Descriptor cd__ZN3ccc6EE12x3E = {  "_ZN3ccc6EE12x3E", // class name
  bases__ZN3ccc6EE12x3E, 1,
  &(vtc__ZN3ccc6EE12x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x3E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x3E),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
namespace ccc { 
struct  EE12x4  : virtual ::ccc::AA12 {
  virtual void  pqr(); // _ZN3ccc6EE12x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE12x43abcEv
  virtual void  efg(); // _ZN3ccc6EE12x43efgEv
  ~EE12x4(); // tgen
  EE12x4(); // tgen
};
//SIG(1 _ZN3ccc6EE12x4E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x43pqrEv");}
void  ccc::EE12x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x43abcEv");}
void  ccc::EE12x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x43efgEv");}
ccc::EE12x4 ::~EE12x4(){ note_dtor("_ZN3ccc6EE12x4E", this);} // tgen
ccc::EE12x4 ::EE12x4(){ note_ctor("_ZN3ccc6EE12x4E", this);} // tgen
}
static void Test__ZN3ccc6EE12x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x4E, buf);
    ::ccc::EE12x4 *dp, &lv = *(dp=new (buf) ::ccc::EE12x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x4E);
    dp->::ccc::EE12x4::~EE12x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x4E(Test__ZN3ccc6EE12x4E, "_ZN3ccc6EE12x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x4C1Ev();
extern void _ZN3ccc6EE12x4D1Ev();
Name_Map name_map__ZN3ccc6EE12x4E[] = {
  NSPAIR(_ZN3ccc6EE12x4C1Ev),
  NSPAIR(_ZN3ccc6EE12x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x4E[];
extern void _ZN3ccc6EE12x43abcEv();
extern void _ZN3ccc6EE12x43pqrEv();
extern void _ZN3ccc6EE12x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x4E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x4E[] = {
  {&(_ZTVN3ccc6EE12x4E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x4E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x4E[];
Class_Descriptor cd__ZN3ccc6EE12x4E = {  "_ZN3ccc6EE12x4E", // class name
  bases__ZN3ccc6EE12x4E, 1,
  &(vtc__ZN3ccc6EE12x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x4E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x4E),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
namespace ccc { 
struct  EE12x5  : virtual ::ccc::AA12 {
  virtual void  pqr(); // _ZN3ccc6EE12x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE12x53efgEv
  virtual void  abc(); // _ZN3ccc6EE12x53abcEv
  ~EE12x5(); // tgen
  EE12x5(); // tgen
};
//SIG(1 _ZN3ccc6EE12x5E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE12x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x53pqrEv");}
void  ccc::EE12x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x53efgEv");}
void  ccc::EE12x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x53abcEv");}
ccc::EE12x5 ::~EE12x5(){ note_dtor("_ZN3ccc6EE12x5E", this);} // tgen
ccc::EE12x5 ::EE12x5(){ note_ctor("_ZN3ccc6EE12x5E", this);} // tgen
}
static void Test__ZN3ccc6EE12x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x5E, buf);
    ::ccc::EE12x5 *dp, &lv = *(dp=new (buf) ::ccc::EE12x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x5E);
    dp->::ccc::EE12x5::~EE12x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x5E(Test__ZN3ccc6EE12x5E, "_ZN3ccc6EE12x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x5C1Ev();
extern void _ZN3ccc6EE12x5D1Ev();
Name_Map name_map__ZN3ccc6EE12x5E[] = {
  NSPAIR(_ZN3ccc6EE12x5C1Ev),
  NSPAIR(_ZN3ccc6EE12x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x5E[];
extern void _ZN3ccc6EE12x53abcEv();
extern void _ZN3ccc6EE12x53pqrEv();
extern void _ZN3ccc6EE12x53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x5E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x53abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x5E[] = {
  {&(_ZTVN3ccc6EE12x5E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x5E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x5E[];
Class_Descriptor cd__ZN3ccc6EE12x5E = {  "_ZN3ccc6EE12x5E", // class name
  bases__ZN3ccc6EE12x5E, 1,
  &(vtc__ZN3ccc6EE12x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x5E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x5E),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
namespace ccc { 
struct  EE12x6  : virtual ::ccc::AA12 {
  virtual void  abc(); // _ZN3ccc6EE12x63abcEv
  virtual void  efg(); // _ZN3ccc6EE12x63efgEv
  ~EE12x6(); // tgen
  EE12x6(); // tgen
};
//SIG(1 _ZN3ccc6EE12x6E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE12x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x63abcEv");}
void  ccc::EE12x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x63efgEv");}
ccc::EE12x6 ::~EE12x6(){ note_dtor("_ZN3ccc6EE12x6E", this);} // tgen
ccc::EE12x6 ::EE12x6(){ note_ctor("_ZN3ccc6EE12x6E", this);} // tgen
}
static void Test__ZN3ccc6EE12x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x6E, buf);
    ::ccc::EE12x6 *dp, &lv = *(dp=new (buf) ::ccc::EE12x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x6E);
    dp->::ccc::EE12x6::~EE12x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x6E(Test__ZN3ccc6EE12x6E, "_ZN3ccc6EE12x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x6C1Ev();
extern void _ZN3ccc6EE12x6D1Ev();
Name_Map name_map__ZN3ccc6EE12x6E[] = {
  NSPAIR(_ZN3ccc6EE12x6C1Ev),
  NSPAIR(_ZN3ccc6EE12x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x6E[];
extern void _ZN3ccc6EE12x63abcEv();
extern void _ZN3ccc6EE12x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x6E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x6E[] = {
  {&(_ZTVN3ccc6EE12x6E[4]),  4,6},
  {&(_ZTVN3ccc6EE12x6E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x6E[];
Class_Descriptor cd__ZN3ccc6EE12x6E = {  "_ZN3ccc6EE12x6E", // class name
  bases__ZN3ccc6EE12x6E, 1,
  &(vtc__ZN3ccc6EE12x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x6E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x6E),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
namespace ccc { 
struct  EE12x7  : virtual ::ccc::AA12 {
  virtual void  abc(); // _ZN3ccc6EE12x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE12x73pqrEv
  ~EE12x7(); // tgen
  EE12x7(); // tgen
};
//SIG(1 _ZN3ccc6EE12x7E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE12x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x73abcEv");}
void  ccc::EE12x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x73pqrEv");}
ccc::EE12x7 ::~EE12x7(){ note_dtor("_ZN3ccc6EE12x7E", this);} // tgen
ccc::EE12x7 ::EE12x7(){ note_ctor("_ZN3ccc6EE12x7E", this);} // tgen
}
static void Test__ZN3ccc6EE12x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x7E, buf);
    ::ccc::EE12x7 *dp, &lv = *(dp=new (buf) ::ccc::EE12x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x7E);
    dp->::ccc::EE12x7::~EE12x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x7E(Test__ZN3ccc6EE12x7E, "_ZN3ccc6EE12x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x7C1Ev();
extern void _ZN3ccc6EE12x7D1Ev();
Name_Map name_map__ZN3ccc6EE12x7E[] = {
  NSPAIR(_ZN3ccc6EE12x7C1Ev),
  NSPAIR(_ZN3ccc6EE12x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x7E[];
extern void _ZN3ccc6EE12x73abcEv();
extern void _ZN3ccc6EE12x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x7E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x7E[] = {
  {&(_ZTVN3ccc6EE12x7E[4]),  4,6},
  {&(_ZTVN3ccc6EE12x7E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x7E[];
Class_Descriptor cd__ZN3ccc6EE12x7E = {  "_ZN3ccc6EE12x7E", // class name
  bases__ZN3ccc6EE12x7E, 1,
  &(vtc__ZN3ccc6EE12x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x7E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x7E),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
namespace ccc { 
struct  EE12x8  : virtual ::ccc::AA12 {
  virtual void  efg(); // _ZN3ccc6EE12x83efgEv
  virtual void  abc(); // _ZN3ccc6EE12x83abcEv
  ~EE12x8(); // tgen
  EE12x8(); // tgen
};
//SIG(1 _ZN3ccc6EE12x8E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE12x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x83efgEv");}
void  ccc::EE12x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE12x83abcEv");}
ccc::EE12x8 ::~EE12x8(){ note_dtor("_ZN3ccc6EE12x8E", this);} // tgen
ccc::EE12x8 ::EE12x8(){ note_ctor("_ZN3ccc6EE12x8E", this);} // tgen
}
static void Test__ZN3ccc6EE12x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x8E, buf);
    ::ccc::EE12x8 *dp, &lv = *(dp=new (buf) ::ccc::EE12x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x8E);
    dp->::ccc::EE12x8::~EE12x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x8E(Test__ZN3ccc6EE12x8E, "_ZN3ccc6EE12x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x8C1Ev();
extern void _ZN3ccc6EE12x8D1Ev();
Name_Map name_map__ZN3ccc6EE12x8E[] = {
  NSPAIR(_ZN3ccc6EE12x8C1Ev),
  NSPAIR(_ZN3ccc6EE12x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x8E[];
extern void _ZN3ccc6EE12x83abcEv();
extern void _ZN3ccc6EE12x83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x8E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE12x83abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x8E[] = {
  {&(_ZTVN3ccc6EE12x8E[4]),  4,6},
  {&(_ZTVN3ccc6EE12x8E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x8E[];
Class_Descriptor cd__ZN3ccc6EE12x8E = {  "_ZN3ccc6EE12x8E", // class name
  bases__ZN3ccc6EE12x8E, 1,
  &(vtc__ZN3ccc6EE12x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x8E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x8E),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
namespace ccc { 
struct  EE12x9  : virtual ::ccc::AA12 {
  virtual void  efg(); // _ZN3ccc6EE12x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE12x93pqrEv
  ~EE12x9(); // tgen
  EE12x9(); // tgen
};
//SIG(1 _ZN3ccc6EE12x9E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE12x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE12x93efgEv");}
void  ccc::EE12x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE12x93pqrEv");}
ccc::EE12x9 ::~EE12x9(){ note_dtor("_ZN3ccc6EE12x9E", this);} // tgen
ccc::EE12x9 ::EE12x9(){ note_ctor("_ZN3ccc6EE12x9E", this);} // tgen
}
static void Test__ZN3ccc6EE12x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE12x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE12x9E, buf);
    ::ccc::EE12x9 *dp, &lv = *(dp=new (buf) ::ccc::EE12x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE12x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE12x9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc6EE12x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE12x9E);
    dp->::ccc::EE12x9::~EE12x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE12x9E(Test__ZN3ccc6EE12x9E, "_ZN3ccc6EE12x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE12x9C1Ev();
extern void _ZN3ccc6EE12x9D1Ev();
Name_Map name_map__ZN3ccc6EE12x9E[] = {
  NSPAIR(_ZN3ccc6EE12x9C1Ev),
  NSPAIR(_ZN3ccc6EE12x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc6EE12x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE12x9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc6EE12x93efgEv();
extern void _ZN3ccc6EE12x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE12x9E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE12x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE12x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE12x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE12x9E[] = {
  {&(_ZTVN3ccc6EE12x9E[4]),  4,7},
  {&(_ZTVN3ccc6EE12x9E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE12x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE12x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE12x9E[];
Class_Descriptor cd__ZN3ccc6EE12x9E = {  "_ZN3ccc6EE12x9E", // class name
  bases__ZN3ccc6EE12x9E, 1,
  &(vtc__ZN3ccc6EE12x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE12x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE12x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE12x9E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE12x9E),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
namespace ccc { 
struct  EE12x10  : virtual ::ccc::AA12 {
  virtual void  pqr(); // _ZN3ccc7EE12x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE12x103abcEv
  ~EE12x10(); // tgen
  EE12x10(); // tgen
};
//SIG(1 _ZN3ccc7EE12x10E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE12x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE12x103pqrEv");}
void  ccc::EE12x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE12x103abcEv");}
ccc::EE12x10 ::~EE12x10(){ note_dtor("_ZN3ccc7EE12x10E", this);} // tgen
ccc::EE12x10 ::EE12x10(){ note_ctor("_ZN3ccc7EE12x10E", this);} // tgen
}
static void Test__ZN3ccc7EE12x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x10E, buf);
    ::ccc::EE12x10 *dp, &lv = *(dp=new (buf) ::ccc::EE12x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x10E);
    dp->::ccc::EE12x10::~EE12x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x10E(Test__ZN3ccc7EE12x10E, "_ZN3ccc7EE12x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x10C1Ev();
extern void _ZN3ccc7EE12x10D1Ev();
Name_Map name_map__ZN3ccc7EE12x10E[] = {
  NSPAIR(_ZN3ccc7EE12x10C1Ev),
  NSPAIR(_ZN3ccc7EE12x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x10E[];
extern void _ZN3ccc7EE12x103abcEv();
extern void _ZN3ccc7EE12x103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x10E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE12x103abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE12x103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x10E[] = {
  {&(_ZTVN3ccc7EE12x10E[4]),  4,6},
  {&(_ZTVN3ccc7EE12x10E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x10E[];
Class_Descriptor cd__ZN3ccc7EE12x10E = {  "_ZN3ccc7EE12x10E", // class name
  bases__ZN3ccc7EE12x10E, 1,
  &(vtc__ZN3ccc7EE12x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x10E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x10E),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
namespace ccc { 
struct  EE12x11  : virtual ::ccc::AA12 {
  virtual void  pqr(); // _ZN3ccc7EE12x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE12x113efgEv
  ~EE12x11(); // tgen
  EE12x11(); // tgen
};
//SIG(1 _ZN3ccc7EE12x11E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE12x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE12x113pqrEv");}
void  ccc::EE12x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE12x113efgEv");}
ccc::EE12x11 ::~EE12x11(){ note_dtor("_ZN3ccc7EE12x11E", this);} // tgen
ccc::EE12x11 ::EE12x11(){ note_ctor("_ZN3ccc7EE12x11E", this);} // tgen
}
static void Test__ZN3ccc7EE12x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x11E, buf);
    ::ccc::EE12x11 *dp, &lv = *(dp=new (buf) ::ccc::EE12x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x11E);
    dp->::ccc::EE12x11::~EE12x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x11E(Test__ZN3ccc7EE12x11E, "_ZN3ccc7EE12x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x11C1Ev();
extern void _ZN3ccc7EE12x11D1Ev();
Name_Map name_map__ZN3ccc7EE12x11E[] = {
  NSPAIR(_ZN3ccc7EE12x11C1Ev),
  NSPAIR(_ZN3ccc7EE12x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc7EE12x113pqrEv();
extern void _ZN3ccc7EE12x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x11E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE12x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE12x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x11E[] = {
  {&(_ZTVN3ccc7EE12x11E[4]),  4,7},
  {&(_ZTVN3ccc7EE12x11E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x11E[];
Class_Descriptor cd__ZN3ccc7EE12x11E = {  "_ZN3ccc7EE12x11E", // class name
  bases__ZN3ccc7EE12x11E, 1,
  &(vtc__ZN3ccc7EE12x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x11E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x11E),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
namespace ccc { 
struct  EE12x12  : virtual ::ccc::AA12 {
  virtual void  abc(); // _ZN3ccc7EE12x123abcEv
  ~EE12x12(); // tgen
  EE12x12(); // tgen
};
//SIG(1 _ZN3ccc7EE12x12E) C1{ VBC2{ v1} v1}
}
namespace ccc { 
void  ccc::EE12x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE12x123abcEv");}
ccc::EE12x12 ::~EE12x12(){ note_dtor("_ZN3ccc7EE12x12E", this);} // tgen
ccc::EE12x12 ::EE12x12(){ note_ctor("_ZN3ccc7EE12x12E", this);} // tgen
}
static void Test__ZN3ccc7EE12x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x12E, buf);
    ::ccc::EE12x12 *dp, &lv = *(dp=new (buf) ::ccc::EE12x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x12E);
    dp->::ccc::EE12x12::~EE12x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x12E(Test__ZN3ccc7EE12x12E, "_ZN3ccc7EE12x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x12C1Ev();
extern void _ZN3ccc7EE12x12D1Ev();
Name_Map name_map__ZN3ccc7EE12x12E[] = {
  NSPAIR(_ZN3ccc7EE12x12C1Ev),
  NSPAIR(_ZN3ccc7EE12x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x12E[];
extern void _ZN3ccc7EE12x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x12E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE12x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x12E[] = {
  {&(_ZTVN3ccc7EE12x12E[4]),  4,5},
  {&(_ZTVN3ccc7EE12x12E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x12E[];
Class_Descriptor cd__ZN3ccc7EE12x12E = {  "_ZN3ccc7EE12x12E", // class name
  bases__ZN3ccc7EE12x12E, 1,
  &(vtc__ZN3ccc7EE12x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x12E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x12E),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
namespace ccc { 
struct  EE12x13  : virtual ::ccc::AA12 {
  virtual void  efg(); // _ZN3ccc7EE12x133efgEv
  ~EE12x13(); // tgen
  EE12x13(); // tgen
};
//SIG(1 _ZN3ccc7EE12x13E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE12x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE12x133efgEv");}
ccc::EE12x13 ::~EE12x13(){ note_dtor("_ZN3ccc7EE12x13E", this);} // tgen
ccc::EE12x13 ::EE12x13(){ note_ctor("_ZN3ccc7EE12x13E", this);} // tgen
}
static void Test__ZN3ccc7EE12x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x13E, buf);
    ::ccc::EE12x13 *dp, &lv = *(dp=new (buf) ::ccc::EE12x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x13E);
    dp->::ccc::EE12x13::~EE12x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x13E(Test__ZN3ccc7EE12x13E, "_ZN3ccc7EE12x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x13C1Ev();
extern void _ZN3ccc7EE12x13D1Ev();
Name_Map name_map__ZN3ccc7EE12x13E[] = {
  NSPAIR(_ZN3ccc7EE12x13C1Ev),
  NSPAIR(_ZN3ccc7EE12x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc7EE12x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x13E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE12x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x13E[] = {
  {&(_ZTVN3ccc7EE12x13E[4]),  4,6},
  {&(_ZTVN3ccc7EE12x13E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x13E[];
Class_Descriptor cd__ZN3ccc7EE12x13E = {  "_ZN3ccc7EE12x13E", // class name
  bases__ZN3ccc7EE12x13E, 1,
  &(vtc__ZN3ccc7EE12x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x13E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x13E),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
namespace ccc { 
struct  EE12x14  : virtual ::ccc::AA12 {
  virtual void  pqr(); // _ZN3ccc7EE12x143pqrEv
  ~EE12x14(); // tgen
  EE12x14(); // tgen
};
//SIG(1 _ZN3ccc7EE12x14E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE12x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE12x143pqrEv");}
ccc::EE12x14 ::~EE12x14(){ note_dtor("_ZN3ccc7EE12x14E", this);} // tgen
ccc::EE12x14 ::EE12x14(){ note_ctor("_ZN3ccc7EE12x14E", this);} // tgen
}
static void Test__ZN3ccc7EE12x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x14E, buf);
    ::ccc::EE12x14 *dp, &lv = *(dp=new (buf) ::ccc::EE12x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x14E);
    dp->::ccc::EE12x14::~EE12x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x14E(Test__ZN3ccc7EE12x14E, "_ZN3ccc7EE12x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x14C1Ev();
extern void _ZN3ccc7EE12x14D1Ev();
Name_Map name_map__ZN3ccc7EE12x14E[] = {
  NSPAIR(_ZN3ccc7EE12x14C1Ev),
  NSPAIR(_ZN3ccc7EE12x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc7EE12x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x14E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc7EE12x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x14E[] = {
  {&(_ZTVN3ccc7EE12x14E[4]),  4,6},
  {&(_ZTVN3ccc7EE12x14E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x14E[];
Class_Descriptor cd__ZN3ccc7EE12x14E = {  "_ZN3ccc7EE12x14E", // class name
  bases__ZN3ccc7EE12x14E, 1,
  &(vtc__ZN3ccc7EE12x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x14E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x14E),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
namespace ccc { 
struct  EE12x15  : virtual ::ccc::AA12 {
  ~EE12x15(); // tgen
  EE12x15(); // tgen
};
//SIG(1 _ZN3ccc7EE12x15E) C1{ VBC2{ v1}}
}
namespace ccc { 
ccc::EE12x15 ::~EE12x15(){ note_dtor("_ZN3ccc7EE12x15E", this);} // tgen
ccc::EE12x15 ::EE12x15(){ note_ctor("_ZN3ccc7EE12x15E", this);} // tgen
}
static void Test__ZN3ccc7EE12x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE12x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE12x15E, buf);
    ::ccc::EE12x15 *dp, &lv = *(dp=new (buf) ::ccc::EE12x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE12x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE12x15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc7EE12x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE12x15E);
    dp->::ccc::EE12x15::~EE12x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE12x15E(Test__ZN3ccc7EE12x15E, "_ZN3ccc7EE12x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE12x15C1Ev();
extern void _ZN3ccc7EE12x15D1Ev();
Name_Map name_map__ZN3ccc7EE12x15E[] = {
  NSPAIR(_ZN3ccc7EE12x15C1Ev),
  NSPAIR(_ZN3ccc7EE12x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
static Base_Class bases__ZN3ccc7EE12x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE12x15E[];
extern void _ZN3ccc4AA123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE12x15E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE12x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE12x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE12x15E[] = {
  {&(_ZTVN3ccc7EE12x15E[4]),  4,5},
  {&(_ZTVN3ccc7EE12x15E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE12x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE12x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE12x15E[];
Class_Descriptor cd__ZN3ccc7EE12x15E = {  "_ZN3ccc7EE12x15E", // class name
  bases__ZN3ccc7EE12x15E, 1,
  &(vtc__ZN3ccc7EE12x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE12x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE12x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE12x15E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE12x15E),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
namespace ccc { 
struct  AA13  {
  virtual void  efg(); // _ZN3ccc4AA133efgEv
  ~AA13(); // tgen
  AA13(); // tgen
};
//SIG(-1 _ZN3ccc4AA13E) C1{ v1}
}
namespace ccc { 
void  ccc::AA13 ::efg(){vfunc_called(this, "_ZN3ccc4AA133efgEv");}
ccc::AA13 ::~AA13(){ note_dtor("_ZN3ccc4AA13E", this);} // tgen
ccc::AA13 ::AA13(){ note_ctor("_ZN3ccc4AA13E", this);} // tgen
}
static void Test__ZN3ccc4AA13E()
{
  extern Class_Descriptor cd__ZN3ccc4AA13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4AA13E, buf);
    ::ccc::AA13 *dp, &lv = *(dp=new (buf) ::ccc::AA13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4AA13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4AA13E)");
    test_class_info(&lv, &cd__ZN3ccc4AA13E);
    dp->::ccc::AA13::~AA13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4AA13E(Test__ZN3ccc4AA13E, "_ZN3ccc4AA13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4AA13C1Ev();
extern void _ZN3ccc4AA13D1Ev();
Name_Map name_map__ZN3ccc4AA13E[] = {
  NSPAIR(_ZN3ccc4AA13C1Ev),
  NSPAIR(_ZN3ccc4AA13D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern void _ZN3ccc4AA133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc4AA13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4AA13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
Class_Descriptor cd__ZN3ccc4AA13E = {  "_ZN3ccc4AA13E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4AA13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4AA13E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4AA13E),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
namespace ccc { 
struct  BB13  {
  virtual void  efg(); // _ZN3ccc4BB133efgEv
  ~BB13(); // tgen
  BB13(); // tgen
};
//SIG(1 _ZN3ccc4BB13E) C1{ v1}
}
namespace ccc { 
void  ccc::BB13 ::efg(){vfunc_called(this, "_ZN3ccc4BB133efgEv");}
ccc::BB13 ::~BB13(){ note_dtor("_ZN3ccc4BB13E", this);} // tgen
ccc::BB13 ::BB13(){ note_ctor("_ZN3ccc4BB13E", this);} // tgen
}
static void Test__ZN3ccc4BB13E()
{
  extern Class_Descriptor cd__ZN3ccc4BB13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4BB13E, buf);
    ::ccc::BB13 *dp, &lv = *(dp=new (buf) ::ccc::BB13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4BB13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4BB13E)");
    test_class_info(&lv, &cd__ZN3ccc4BB13E);
    dp->::ccc::BB13::~BB13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4BB13E(Test__ZN3ccc4BB13E, "_ZN3ccc4BB13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4BB13C1Ev();
extern void _ZN3ccc4BB13D1Ev();
Name_Map name_map__ZN3ccc4BB13E[] = {
  NSPAIR(_ZN3ccc4BB13C1Ev),
  NSPAIR(_ZN3ccc4BB13D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc4BB13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4BB13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
Class_Descriptor cd__ZN3ccc4BB13E = {  "_ZN3ccc4BB13E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4BB13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4BB13E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4BB13E),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
namespace ccc { 
struct  EE13x0  : virtual ::ccc::AA13 {
  virtual void  abc(); // _ZN3ccc6EE13x03abcEv
  virtual void  efg(); // _ZN3ccc6EE13x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE13x03pqrEv
  ~EE13x0(); // tgen
  EE13x0(); // tgen
};
//SIG(1 _ZN3ccc6EE13x0E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x03abcEv");}
void  ccc::EE13x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x03efgEv");}
void  ccc::EE13x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x03pqrEv");}
ccc::EE13x0 ::~EE13x0(){ note_dtor("_ZN3ccc6EE13x0E", this);} // tgen
ccc::EE13x0 ::EE13x0(){ note_ctor("_ZN3ccc6EE13x0E", this);} // tgen
}
static void Test__ZN3ccc6EE13x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x0E, buf);
    ::ccc::EE13x0 *dp, &lv = *(dp=new (buf) ::ccc::EE13x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x0E);
    dp->::ccc::EE13x0::~EE13x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x0E(Test__ZN3ccc6EE13x0E, "_ZN3ccc6EE13x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x0C1Ev();
extern void _ZN3ccc6EE13x0D1Ev();
Name_Map name_map__ZN3ccc6EE13x0E[] = {
  NSPAIR(_ZN3ccc6EE13x0C1Ev),
  NSPAIR(_ZN3ccc6EE13x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x0E[];
extern void _ZN3ccc6EE13x03efgEv();
extern void _ZN3ccc6EE13x03abcEv();
extern void _ZN3ccc6EE13x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x0E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x0E[] = {
  {&(_ZTVN3ccc6EE13x0E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x0E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x0E[];
Class_Descriptor cd__ZN3ccc6EE13x0E = {  "_ZN3ccc6EE13x0E", // class name
  bases__ZN3ccc6EE13x0E, 1,
  &(vtc__ZN3ccc6EE13x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x0E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x0E),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
namespace ccc { 
struct  EE13x1  : virtual ::ccc::AA13 {
  virtual void  abc(); // _ZN3ccc6EE13x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE13x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE13x13efgEv
  ~EE13x1(); // tgen
  EE13x1(); // tgen
};
//SIG(1 _ZN3ccc6EE13x1E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x13abcEv");}
void  ccc::EE13x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x13pqrEv");}
void  ccc::EE13x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x13efgEv");}
ccc::EE13x1 ::~EE13x1(){ note_dtor("_ZN3ccc6EE13x1E", this);} // tgen
ccc::EE13x1 ::EE13x1(){ note_ctor("_ZN3ccc6EE13x1E", this);} // tgen
}
static void Test__ZN3ccc6EE13x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x1E, buf);
    ::ccc::EE13x1 *dp, &lv = *(dp=new (buf) ::ccc::EE13x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x1E);
    dp->::ccc::EE13x1::~EE13x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x1E(Test__ZN3ccc6EE13x1E, "_ZN3ccc6EE13x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x1C1Ev();
extern void _ZN3ccc6EE13x1D1Ev();
Name_Map name_map__ZN3ccc6EE13x1E[] = {
  NSPAIR(_ZN3ccc6EE13x1C1Ev),
  NSPAIR(_ZN3ccc6EE13x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x1E[];
extern void _ZN3ccc6EE13x13efgEv();
extern void _ZN3ccc6EE13x13abcEv();
extern void _ZN3ccc6EE13x13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x1E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x13efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x1E[] = {
  {&(_ZTVN3ccc6EE13x1E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x1E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x1E[];
Class_Descriptor cd__ZN3ccc6EE13x1E = {  "_ZN3ccc6EE13x1E", // class name
  bases__ZN3ccc6EE13x1E, 1,
  &(vtc__ZN3ccc6EE13x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x1E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x1E),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
namespace ccc { 
struct  EE13x2  : virtual ::ccc::AA13 {
  virtual void  efg(); // _ZN3ccc6EE13x23efgEv
  virtual void  abc(); // _ZN3ccc6EE13x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE13x23pqrEv
  ~EE13x2(); // tgen
  EE13x2(); // tgen
};
//SIG(1 _ZN3ccc6EE13x2E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x23efgEv");}
void  ccc::EE13x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x23abcEv");}
void  ccc::EE13x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x23pqrEv");}
ccc::EE13x2 ::~EE13x2(){ note_dtor("_ZN3ccc6EE13x2E", this);} // tgen
ccc::EE13x2 ::EE13x2(){ note_ctor("_ZN3ccc6EE13x2E", this);} // tgen
}
static void Test__ZN3ccc6EE13x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x2E, buf);
    ::ccc::EE13x2 *dp, &lv = *(dp=new (buf) ::ccc::EE13x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x2E);
    dp->::ccc::EE13x2::~EE13x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x2E(Test__ZN3ccc6EE13x2E, "_ZN3ccc6EE13x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x2C1Ev();
extern void _ZN3ccc6EE13x2D1Ev();
Name_Map name_map__ZN3ccc6EE13x2E[] = {
  NSPAIR(_ZN3ccc6EE13x2C1Ev),
  NSPAIR(_ZN3ccc6EE13x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x2E[];
extern void _ZN3ccc6EE13x23efgEv();
extern void _ZN3ccc6EE13x23abcEv();
extern void _ZN3ccc6EE13x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x2E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x2E[] = {
  {&(_ZTVN3ccc6EE13x2E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x2E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x2E[];
Class_Descriptor cd__ZN3ccc6EE13x2E = {  "_ZN3ccc6EE13x2E", // class name
  bases__ZN3ccc6EE13x2E, 1,
  &(vtc__ZN3ccc6EE13x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x2E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x2E),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
namespace ccc { 
struct  EE13x3  : virtual ::ccc::AA13 {
  virtual void  efg(); // _ZN3ccc6EE13x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE13x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE13x33abcEv
  ~EE13x3(); // tgen
  EE13x3(); // tgen
};
//SIG(1 _ZN3ccc6EE13x3E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x33efgEv");}
void  ccc::EE13x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x33pqrEv");}
void  ccc::EE13x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x33abcEv");}
ccc::EE13x3 ::~EE13x3(){ note_dtor("_ZN3ccc6EE13x3E", this);} // tgen
ccc::EE13x3 ::EE13x3(){ note_ctor("_ZN3ccc6EE13x3E", this);} // tgen
}
static void Test__ZN3ccc6EE13x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x3E, buf);
    ::ccc::EE13x3 *dp, &lv = *(dp=new (buf) ::ccc::EE13x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x3E);
    dp->::ccc::EE13x3::~EE13x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x3E(Test__ZN3ccc6EE13x3E, "_ZN3ccc6EE13x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x3C1Ev();
extern void _ZN3ccc6EE13x3D1Ev();
Name_Map name_map__ZN3ccc6EE13x3E[] = {
  NSPAIR(_ZN3ccc6EE13x3C1Ev),
  NSPAIR(_ZN3ccc6EE13x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x3E[];
extern void _ZN3ccc6EE13x33efgEv();
extern void _ZN3ccc6EE13x33pqrEv();
extern void _ZN3ccc6EE13x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x3E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x3E[] = {
  {&(_ZTVN3ccc6EE13x3E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x3E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x3E[];
Class_Descriptor cd__ZN3ccc6EE13x3E = {  "_ZN3ccc6EE13x3E", // class name
  bases__ZN3ccc6EE13x3E, 1,
  &(vtc__ZN3ccc6EE13x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x3E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x3E),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
namespace ccc { 
struct  EE13x4  : virtual ::ccc::AA13 {
  virtual void  pqr(); // _ZN3ccc6EE13x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE13x43abcEv
  virtual void  efg(); // _ZN3ccc6EE13x43efgEv
  ~EE13x4(); // tgen
  EE13x4(); // tgen
};
//SIG(1 _ZN3ccc6EE13x4E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x43pqrEv");}
void  ccc::EE13x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x43abcEv");}
void  ccc::EE13x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x43efgEv");}
ccc::EE13x4 ::~EE13x4(){ note_dtor("_ZN3ccc6EE13x4E", this);} // tgen
ccc::EE13x4 ::EE13x4(){ note_ctor("_ZN3ccc6EE13x4E", this);} // tgen
}
static void Test__ZN3ccc6EE13x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x4E, buf);
    ::ccc::EE13x4 *dp, &lv = *(dp=new (buf) ::ccc::EE13x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x4E);
    dp->::ccc::EE13x4::~EE13x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x4E(Test__ZN3ccc6EE13x4E, "_ZN3ccc6EE13x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x4C1Ev();
extern void _ZN3ccc6EE13x4D1Ev();
Name_Map name_map__ZN3ccc6EE13x4E[] = {
  NSPAIR(_ZN3ccc6EE13x4C1Ev),
  NSPAIR(_ZN3ccc6EE13x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x4E[];
extern void _ZN3ccc6EE13x43efgEv();
extern void _ZN3ccc6EE13x43pqrEv();
extern void _ZN3ccc6EE13x43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x4E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x43efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x4E[] = {
  {&(_ZTVN3ccc6EE13x4E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x4E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x4E[];
Class_Descriptor cd__ZN3ccc6EE13x4E = {  "_ZN3ccc6EE13x4E", // class name
  bases__ZN3ccc6EE13x4E, 1,
  &(vtc__ZN3ccc6EE13x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x4E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x4E),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
namespace ccc { 
struct  EE13x5  : virtual ::ccc::AA13 {
  virtual void  pqr(); // _ZN3ccc6EE13x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE13x53efgEv
  virtual void  abc(); // _ZN3ccc6EE13x53abcEv
  ~EE13x5(); // tgen
  EE13x5(); // tgen
};
//SIG(1 _ZN3ccc6EE13x5E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE13x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x53pqrEv");}
void  ccc::EE13x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x53efgEv");}
void  ccc::EE13x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x53abcEv");}
ccc::EE13x5 ::~EE13x5(){ note_dtor("_ZN3ccc6EE13x5E", this);} // tgen
ccc::EE13x5 ::EE13x5(){ note_ctor("_ZN3ccc6EE13x5E", this);} // tgen
}
static void Test__ZN3ccc6EE13x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x5E, buf);
    ::ccc::EE13x5 *dp, &lv = *(dp=new (buf) ::ccc::EE13x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x5E);
    dp->::ccc::EE13x5::~EE13x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x5E(Test__ZN3ccc6EE13x5E, "_ZN3ccc6EE13x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x5C1Ev();
extern void _ZN3ccc6EE13x5D1Ev();
Name_Map name_map__ZN3ccc6EE13x5E[] = {
  NSPAIR(_ZN3ccc6EE13x5C1Ev),
  NSPAIR(_ZN3ccc6EE13x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x5E[];
extern void _ZN3ccc6EE13x53efgEv();
extern void _ZN3ccc6EE13x53pqrEv();
extern void _ZN3ccc6EE13x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x5E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x5E[] = {
  {&(_ZTVN3ccc6EE13x5E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x5E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x5E[];
Class_Descriptor cd__ZN3ccc6EE13x5E = {  "_ZN3ccc6EE13x5E", // class name
  bases__ZN3ccc6EE13x5E, 1,
  &(vtc__ZN3ccc6EE13x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x5E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x5E),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
namespace ccc { 
struct  EE13x6  : virtual ::ccc::AA13 {
  virtual void  abc(); // _ZN3ccc6EE13x63abcEv
  virtual void  efg(); // _ZN3ccc6EE13x63efgEv
  ~EE13x6(); // tgen
  EE13x6(); // tgen
};
//SIG(1 _ZN3ccc6EE13x6E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE13x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x63abcEv");}
void  ccc::EE13x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x63efgEv");}
ccc::EE13x6 ::~EE13x6(){ note_dtor("_ZN3ccc6EE13x6E", this);} // tgen
ccc::EE13x6 ::EE13x6(){ note_ctor("_ZN3ccc6EE13x6E", this);} // tgen
}
static void Test__ZN3ccc6EE13x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x6E, buf);
    ::ccc::EE13x6 *dp, &lv = *(dp=new (buf) ::ccc::EE13x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x6E);
    dp->::ccc::EE13x6::~EE13x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x6E(Test__ZN3ccc6EE13x6E, "_ZN3ccc6EE13x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x6C1Ev();
extern void _ZN3ccc6EE13x6D1Ev();
Name_Map name_map__ZN3ccc6EE13x6E[] = {
  NSPAIR(_ZN3ccc6EE13x6C1Ev),
  NSPAIR(_ZN3ccc6EE13x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x6E[];
extern void _ZN3ccc6EE13x63efgEv();
extern void _ZN3ccc6EE13x63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x6E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x63efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x6E[] = {
  {&(_ZTVN3ccc6EE13x6E[4]),  4,6},
  {&(_ZTVN3ccc6EE13x6E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x6E[];
Class_Descriptor cd__ZN3ccc6EE13x6E = {  "_ZN3ccc6EE13x6E", // class name
  bases__ZN3ccc6EE13x6E, 1,
  &(vtc__ZN3ccc6EE13x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x6E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x6E),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
namespace ccc { 
struct  EE13x7  : virtual ::ccc::AA13 {
  virtual void  abc(); // _ZN3ccc6EE13x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE13x73pqrEv
  ~EE13x7(); // tgen
  EE13x7(); // tgen
};
//SIG(1 _ZN3ccc6EE13x7E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE13x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x73abcEv");}
void  ccc::EE13x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x73pqrEv");}
ccc::EE13x7 ::~EE13x7(){ note_dtor("_ZN3ccc6EE13x7E", this);} // tgen
ccc::EE13x7 ::EE13x7(){ note_ctor("_ZN3ccc6EE13x7E", this);} // tgen
}
static void Test__ZN3ccc6EE13x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x7E, buf);
    ::ccc::EE13x7 *dp, &lv = *(dp=new (buf) ::ccc::EE13x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x7E);
    dp->::ccc::EE13x7::~EE13x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x7E(Test__ZN3ccc6EE13x7E, "_ZN3ccc6EE13x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x7C1Ev();
extern void _ZN3ccc6EE13x7D1Ev();
Name_Map name_map__ZN3ccc6EE13x7E[] = {
  NSPAIR(_ZN3ccc6EE13x7C1Ev),
  NSPAIR(_ZN3ccc6EE13x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc6EE13x73abcEv();
extern void _ZN3ccc6EE13x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x7E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x7E[] = {
  {&(_ZTVN3ccc6EE13x7E[4]),  4,7},
  {&(_ZTVN3ccc6EE13x7E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x7E[];
Class_Descriptor cd__ZN3ccc6EE13x7E = {  "_ZN3ccc6EE13x7E", // class name
  bases__ZN3ccc6EE13x7E, 1,
  &(vtc__ZN3ccc6EE13x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x7E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x7E),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
namespace ccc { 
struct  EE13x8  : virtual ::ccc::AA13 {
  virtual void  efg(); // _ZN3ccc6EE13x83efgEv
  virtual void  abc(); // _ZN3ccc6EE13x83abcEv
  ~EE13x8(); // tgen
  EE13x8(); // tgen
};
//SIG(1 _ZN3ccc6EE13x8E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE13x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x83efgEv");}
void  ccc::EE13x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE13x83abcEv");}
ccc::EE13x8 ::~EE13x8(){ note_dtor("_ZN3ccc6EE13x8E", this);} // tgen
ccc::EE13x8 ::EE13x8(){ note_ctor("_ZN3ccc6EE13x8E", this);} // tgen
}
static void Test__ZN3ccc6EE13x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x8E, buf);
    ::ccc::EE13x8 *dp, &lv = *(dp=new (buf) ::ccc::EE13x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x8E);
    dp->::ccc::EE13x8::~EE13x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x8E(Test__ZN3ccc6EE13x8E, "_ZN3ccc6EE13x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x8C1Ev();
extern void _ZN3ccc6EE13x8D1Ev();
Name_Map name_map__ZN3ccc6EE13x8E[] = {
  NSPAIR(_ZN3ccc6EE13x8C1Ev),
  NSPAIR(_ZN3ccc6EE13x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x8E[];
extern void _ZN3ccc6EE13x83efgEv();
extern void _ZN3ccc6EE13x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x8E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x8E[] = {
  {&(_ZTVN3ccc6EE13x8E[4]),  4,6},
  {&(_ZTVN3ccc6EE13x8E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x8E[];
Class_Descriptor cd__ZN3ccc6EE13x8E = {  "_ZN3ccc6EE13x8E", // class name
  bases__ZN3ccc6EE13x8E, 1,
  &(vtc__ZN3ccc6EE13x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x8E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x8E),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
namespace ccc { 
struct  EE13x9  : virtual ::ccc::AA13 {
  virtual void  efg(); // _ZN3ccc6EE13x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE13x93pqrEv
  ~EE13x9(); // tgen
  EE13x9(); // tgen
};
//SIG(1 _ZN3ccc6EE13x9E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE13x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE13x93efgEv");}
void  ccc::EE13x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE13x93pqrEv");}
ccc::EE13x9 ::~EE13x9(){ note_dtor("_ZN3ccc6EE13x9E", this);} // tgen
ccc::EE13x9 ::EE13x9(){ note_ctor("_ZN3ccc6EE13x9E", this);} // tgen
}
static void Test__ZN3ccc6EE13x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE13x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE13x9E, buf);
    ::ccc::EE13x9 *dp, &lv = *(dp=new (buf) ::ccc::EE13x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE13x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE13x9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc6EE13x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE13x9E);
    dp->::ccc::EE13x9::~EE13x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE13x9E(Test__ZN3ccc6EE13x9E, "_ZN3ccc6EE13x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE13x9C1Ev();
extern void _ZN3ccc6EE13x9D1Ev();
Name_Map name_map__ZN3ccc6EE13x9E[] = {
  NSPAIR(_ZN3ccc6EE13x9C1Ev),
  NSPAIR(_ZN3ccc6EE13x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc6EE13x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE13x9E[];
extern void _ZN3ccc6EE13x93efgEv();
extern void _ZN3ccc6EE13x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE13x9E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE13x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE13x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE13x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE13x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE13x9E[] = {
  {&(_ZTVN3ccc6EE13x9E[4]),  4,6},
  {&(_ZTVN3ccc6EE13x9E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE13x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE13x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE13x9E[];
Class_Descriptor cd__ZN3ccc6EE13x9E = {  "_ZN3ccc6EE13x9E", // class name
  bases__ZN3ccc6EE13x9E, 1,
  &(vtc__ZN3ccc6EE13x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE13x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE13x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE13x9E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE13x9E),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
namespace ccc { 
struct  EE13x10  : virtual ::ccc::AA13 {
  virtual void  pqr(); // _ZN3ccc7EE13x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE13x103abcEv
  ~EE13x10(); // tgen
  EE13x10(); // tgen
};
//SIG(1 _ZN3ccc7EE13x10E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE13x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE13x103pqrEv");}
void  ccc::EE13x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE13x103abcEv");}
ccc::EE13x10 ::~EE13x10(){ note_dtor("_ZN3ccc7EE13x10E", this);} // tgen
ccc::EE13x10 ::EE13x10(){ note_ctor("_ZN3ccc7EE13x10E", this);} // tgen
}
static void Test__ZN3ccc7EE13x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x10E, buf);
    ::ccc::EE13x10 *dp, &lv = *(dp=new (buf) ::ccc::EE13x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x10E);
    dp->::ccc::EE13x10::~EE13x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x10E(Test__ZN3ccc7EE13x10E, "_ZN3ccc7EE13x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x10C1Ev();
extern void _ZN3ccc7EE13x10D1Ev();
Name_Map name_map__ZN3ccc7EE13x10E[] = {
  NSPAIR(_ZN3ccc7EE13x10C1Ev),
  NSPAIR(_ZN3ccc7EE13x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc7EE13x103pqrEv();
extern void _ZN3ccc7EE13x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x10E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE13x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE13x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x10E[] = {
  {&(_ZTVN3ccc7EE13x10E[4]),  4,7},
  {&(_ZTVN3ccc7EE13x10E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x10E[];
Class_Descriptor cd__ZN3ccc7EE13x10E = {  "_ZN3ccc7EE13x10E", // class name
  bases__ZN3ccc7EE13x10E, 1,
  &(vtc__ZN3ccc7EE13x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x10E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x10E),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
namespace ccc { 
struct  EE13x11  : virtual ::ccc::AA13 {
  virtual void  pqr(); // _ZN3ccc7EE13x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE13x113efgEv
  ~EE13x11(); // tgen
  EE13x11(); // tgen
};
//SIG(1 _ZN3ccc7EE13x11E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE13x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE13x113pqrEv");}
void  ccc::EE13x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE13x113efgEv");}
ccc::EE13x11 ::~EE13x11(){ note_dtor("_ZN3ccc7EE13x11E", this);} // tgen
ccc::EE13x11 ::EE13x11(){ note_ctor("_ZN3ccc7EE13x11E", this);} // tgen
}
static void Test__ZN3ccc7EE13x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x11E, buf);
    ::ccc::EE13x11 *dp, &lv = *(dp=new (buf) ::ccc::EE13x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x11E);
    dp->::ccc::EE13x11::~EE13x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x11E(Test__ZN3ccc7EE13x11E, "_ZN3ccc7EE13x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x11C1Ev();
extern void _ZN3ccc7EE13x11D1Ev();
Name_Map name_map__ZN3ccc7EE13x11E[] = {
  NSPAIR(_ZN3ccc7EE13x11C1Ev),
  NSPAIR(_ZN3ccc7EE13x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x11E[];
extern void _ZN3ccc7EE13x113efgEv();
extern void _ZN3ccc7EE13x113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x11E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE13x113efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE13x113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x11E[] = {
  {&(_ZTVN3ccc7EE13x11E[4]),  4,6},
  {&(_ZTVN3ccc7EE13x11E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x11E[];
Class_Descriptor cd__ZN3ccc7EE13x11E = {  "_ZN3ccc7EE13x11E", // class name
  bases__ZN3ccc7EE13x11E, 1,
  &(vtc__ZN3ccc7EE13x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x11E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x11E),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
namespace ccc { 
struct  EE13x12  : virtual ::ccc::AA13 {
  virtual void  abc(); // _ZN3ccc7EE13x123abcEv
  ~EE13x12(); // tgen
  EE13x12(); // tgen
};
//SIG(1 _ZN3ccc7EE13x12E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE13x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE13x123abcEv");}
ccc::EE13x12 ::~EE13x12(){ note_dtor("_ZN3ccc7EE13x12E", this);} // tgen
ccc::EE13x12 ::EE13x12(){ note_ctor("_ZN3ccc7EE13x12E", this);} // tgen
}
static void Test__ZN3ccc7EE13x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x12E, buf);
    ::ccc::EE13x12 *dp, &lv = *(dp=new (buf) ::ccc::EE13x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x12E);
    dp->::ccc::EE13x12::~EE13x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x12E(Test__ZN3ccc7EE13x12E, "_ZN3ccc7EE13x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x12C1Ev();
extern void _ZN3ccc7EE13x12D1Ev();
Name_Map name_map__ZN3ccc7EE13x12E[] = {
  NSPAIR(_ZN3ccc7EE13x12C1Ev),
  NSPAIR(_ZN3ccc7EE13x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc7EE13x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x12E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE13x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x12E[] = {
  {&(_ZTVN3ccc7EE13x12E[4]),  4,6},
  {&(_ZTVN3ccc7EE13x12E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x12E[];
Class_Descriptor cd__ZN3ccc7EE13x12E = {  "_ZN3ccc7EE13x12E", // class name
  bases__ZN3ccc7EE13x12E, 1,
  &(vtc__ZN3ccc7EE13x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x12E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x12E),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
namespace ccc { 
struct  EE13x13  : virtual ::ccc::AA13 {
  virtual void  efg(); // _ZN3ccc7EE13x133efgEv
  ~EE13x13(); // tgen
  EE13x13(); // tgen
};
//SIG(1 _ZN3ccc7EE13x13E) C1{ VBC2{ v1} v1}
}
namespace ccc { 
void  ccc::EE13x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE13x133efgEv");}
ccc::EE13x13 ::~EE13x13(){ note_dtor("_ZN3ccc7EE13x13E", this);} // tgen
ccc::EE13x13 ::EE13x13(){ note_ctor("_ZN3ccc7EE13x13E", this);} // tgen
}
static void Test__ZN3ccc7EE13x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x13E, buf);
    ::ccc::EE13x13 *dp, &lv = *(dp=new (buf) ::ccc::EE13x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x13E);
    dp->::ccc::EE13x13::~EE13x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x13E(Test__ZN3ccc7EE13x13E, "_ZN3ccc7EE13x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x13C1Ev();
extern void _ZN3ccc7EE13x13D1Ev();
Name_Map name_map__ZN3ccc7EE13x13E[] = {
  NSPAIR(_ZN3ccc7EE13x13C1Ev),
  NSPAIR(_ZN3ccc7EE13x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x13E[];
extern void _ZN3ccc7EE13x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x13E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE13x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x13E[] = {
  {&(_ZTVN3ccc7EE13x13E[4]),  4,5},
  {&(_ZTVN3ccc7EE13x13E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x13E[];
Class_Descriptor cd__ZN3ccc7EE13x13E = {  "_ZN3ccc7EE13x13E", // class name
  bases__ZN3ccc7EE13x13E, 1,
  &(vtc__ZN3ccc7EE13x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x13E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x13E),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
namespace ccc { 
struct  EE13x14  : virtual ::ccc::AA13 {
  virtual void  pqr(); // _ZN3ccc7EE13x143pqrEv
  ~EE13x14(); // tgen
  EE13x14(); // tgen
};
//SIG(1 _ZN3ccc7EE13x14E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE13x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE13x143pqrEv");}
ccc::EE13x14 ::~EE13x14(){ note_dtor("_ZN3ccc7EE13x14E", this);} // tgen
ccc::EE13x14 ::EE13x14(){ note_ctor("_ZN3ccc7EE13x14E", this);} // tgen
}
static void Test__ZN3ccc7EE13x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x14E, buf);
    ::ccc::EE13x14 *dp, &lv = *(dp=new (buf) ::ccc::EE13x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x14E);
    dp->::ccc::EE13x14::~EE13x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x14E(Test__ZN3ccc7EE13x14E, "_ZN3ccc7EE13x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x14C1Ev();
extern void _ZN3ccc7EE13x14D1Ev();
Name_Map name_map__ZN3ccc7EE13x14E[] = {
  NSPAIR(_ZN3ccc7EE13x14C1Ev),
  NSPAIR(_ZN3ccc7EE13x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc7EE13x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x14E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc7EE13x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x14E[] = {
  {&(_ZTVN3ccc7EE13x14E[4]),  4,6},
  {&(_ZTVN3ccc7EE13x14E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x14E[];
Class_Descriptor cd__ZN3ccc7EE13x14E = {  "_ZN3ccc7EE13x14E", // class name
  bases__ZN3ccc7EE13x14E, 1,
  &(vtc__ZN3ccc7EE13x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x14E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x14E),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
namespace ccc { 
struct  EE13x15  : virtual ::ccc::AA13 {
  ~EE13x15(); // tgen
  EE13x15(); // tgen
};
//SIG(1 _ZN3ccc7EE13x15E) C1{ VBC2{ v1}}
}
namespace ccc { 
ccc::EE13x15 ::~EE13x15(){ note_dtor("_ZN3ccc7EE13x15E", this);} // tgen
ccc::EE13x15 ::EE13x15(){ note_ctor("_ZN3ccc7EE13x15E", this);} // tgen
}
static void Test__ZN3ccc7EE13x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE13x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE13x15E, buf);
    ::ccc::EE13x15 *dp, &lv = *(dp=new (buf) ::ccc::EE13x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE13x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE13x15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc7EE13x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE13x15E);
    dp->::ccc::EE13x15::~EE13x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE13x15E(Test__ZN3ccc7EE13x15E, "_ZN3ccc7EE13x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE13x15C1Ev();
extern void _ZN3ccc7EE13x15D1Ev();
Name_Map name_map__ZN3ccc7EE13x15E[] = {
  NSPAIR(_ZN3ccc7EE13x15C1Ev),
  NSPAIR(_ZN3ccc7EE13x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
static Base_Class bases__ZN3ccc7EE13x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE13x15E[];
extern void _ZN3ccc4AA133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE13x15E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE13x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE13x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE13x15E[] = {
  {&(_ZTVN3ccc7EE13x15E[4]),  4,5},
  {&(_ZTVN3ccc7EE13x15E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE13x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE13x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE13x15E[];
Class_Descriptor cd__ZN3ccc7EE13x15E = {  "_ZN3ccc7EE13x15E", // class name
  bases__ZN3ccc7EE13x15E, 1,
  &(vtc__ZN3ccc7EE13x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE13x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE13x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE13x15E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE13x15E),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
namespace ccc { 
struct  AA14  {
  virtual void  pqr(); // _ZN3ccc4AA143pqrEv
  ~AA14(); // tgen
  AA14(); // tgen
};
//SIG(-1 _ZN3ccc4AA14E) C1{ v1}
}
namespace ccc { 
void  ccc::AA14 ::pqr(){vfunc_called(this, "_ZN3ccc4AA143pqrEv");}
ccc::AA14 ::~AA14(){ note_dtor("_ZN3ccc4AA14E", this);} // tgen
ccc::AA14 ::AA14(){ note_ctor("_ZN3ccc4AA14E", this);} // tgen
}
static void Test__ZN3ccc4AA14E()
{
  extern Class_Descriptor cd__ZN3ccc4AA14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4AA14E, buf);
    ::ccc::AA14 *dp, &lv = *(dp=new (buf) ::ccc::AA14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4AA14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4AA14E)");
    test_class_info(&lv, &cd__ZN3ccc4AA14E);
    dp->::ccc::AA14::~AA14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4AA14E(Test__ZN3ccc4AA14E, "_ZN3ccc4AA14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4AA14C1Ev();
extern void _ZN3ccc4AA14D1Ev();
Name_Map name_map__ZN3ccc4AA14E[] = {
  NSPAIR(_ZN3ccc4AA14C1Ev),
  NSPAIR(_ZN3ccc4AA14D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern void _ZN3ccc4AA143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc4AA14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4AA14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
Class_Descriptor cd__ZN3ccc4AA14E = {  "_ZN3ccc4AA14E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4AA14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4AA14E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4AA14E),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
namespace ccc { 
struct  BB14  {
  virtual void  pqr(); // _ZN3ccc4BB143pqrEv
  ~BB14(); // tgen
  BB14(); // tgen
};
//SIG(1 _ZN3ccc4BB14E) C1{ v1}
}
namespace ccc { 
void  ccc::BB14 ::pqr(){vfunc_called(this, "_ZN3ccc4BB143pqrEv");}
ccc::BB14 ::~BB14(){ note_dtor("_ZN3ccc4BB14E", this);} // tgen
ccc::BB14 ::BB14(){ note_ctor("_ZN3ccc4BB14E", this);} // tgen
}
static void Test__ZN3ccc4BB14E()
{
  extern Class_Descriptor cd__ZN3ccc4BB14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc4BB14E, buf);
    ::ccc::BB14 *dp, &lv = *(dp=new (buf) ::ccc::BB14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc4BB14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc4BB14E)");
    test_class_info(&lv, &cd__ZN3ccc4BB14E);
    dp->::ccc::BB14::~BB14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc4BB14E(Test__ZN3ccc4BB14E, "_ZN3ccc4BB14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc4BB14C1Ev();
extern void _ZN3ccc4BB14D1Ev();
Name_Map name_map__ZN3ccc4BB14E[] = {
  NSPAIR(_ZN3ccc4BB14C1Ev),
  NSPAIR(_ZN3ccc4BB14D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc4BB14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc4BB14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
Class_Descriptor cd__ZN3ccc4BB14E = {  "_ZN3ccc4BB14E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc4BB14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc4BB14E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc4BB14E),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
namespace ccc { 
struct  EE14x0  : virtual ::ccc::AA14 {
  virtual void  abc(); // _ZN3ccc6EE14x03abcEv
  virtual void  efg(); // _ZN3ccc6EE14x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE14x03pqrEv
  ~EE14x0(); // tgen
  EE14x0(); // tgen
};
//SIG(1 _ZN3ccc6EE14x0E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x03abcEv");}
void  ccc::EE14x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x03efgEv");}
void  ccc::EE14x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x03pqrEv");}
ccc::EE14x0 ::~EE14x0(){ note_dtor("_ZN3ccc6EE14x0E", this);} // tgen
ccc::EE14x0 ::EE14x0(){ note_ctor("_ZN3ccc6EE14x0E", this);} // tgen
}
static void Test__ZN3ccc6EE14x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x0E, buf);
    ::ccc::EE14x0 *dp, &lv = *(dp=new (buf) ::ccc::EE14x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x0E);
    dp->::ccc::EE14x0::~EE14x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x0E(Test__ZN3ccc6EE14x0E, "_ZN3ccc6EE14x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x0C1Ev();
extern void _ZN3ccc6EE14x0D1Ev();
Name_Map name_map__ZN3ccc6EE14x0E[] = {
  NSPAIR(_ZN3ccc6EE14x0C1Ev),
  NSPAIR(_ZN3ccc6EE14x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x0E[];
extern void _ZN3ccc6EE14x03pqrEv();
extern void _ZN3ccc6EE14x03abcEv();
extern void _ZN3ccc6EE14x03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x0E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x0E[] = {
  {&(_ZTVN3ccc6EE14x0E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x0E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x0E[];
Class_Descriptor cd__ZN3ccc6EE14x0E = {  "_ZN3ccc6EE14x0E", // class name
  bases__ZN3ccc6EE14x0E, 1,
  &(vtc__ZN3ccc6EE14x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x0E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x0E),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
namespace ccc { 
struct  EE14x1  : virtual ::ccc::AA14 {
  virtual void  abc(); // _ZN3ccc6EE14x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE14x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE14x13efgEv
  ~EE14x1(); // tgen
  EE14x1(); // tgen
};
//SIG(1 _ZN3ccc6EE14x1E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x13abcEv");}
void  ccc::EE14x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x13pqrEv");}
void  ccc::EE14x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x13efgEv");}
ccc::EE14x1 ::~EE14x1(){ note_dtor("_ZN3ccc6EE14x1E", this);} // tgen
ccc::EE14x1 ::EE14x1(){ note_ctor("_ZN3ccc6EE14x1E", this);} // tgen
}
static void Test__ZN3ccc6EE14x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x1E, buf);
    ::ccc::EE14x1 *dp, &lv = *(dp=new (buf) ::ccc::EE14x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x1E);
    dp->::ccc::EE14x1::~EE14x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x1E(Test__ZN3ccc6EE14x1E, "_ZN3ccc6EE14x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x1C1Ev();
extern void _ZN3ccc6EE14x1D1Ev();
Name_Map name_map__ZN3ccc6EE14x1E[] = {
  NSPAIR(_ZN3ccc6EE14x1C1Ev),
  NSPAIR(_ZN3ccc6EE14x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x1E[];
extern void _ZN3ccc6EE14x13pqrEv();
extern void _ZN3ccc6EE14x13abcEv();
extern void _ZN3ccc6EE14x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x1E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x1E[] = {
  {&(_ZTVN3ccc6EE14x1E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x1E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x1E[];
Class_Descriptor cd__ZN3ccc6EE14x1E = {  "_ZN3ccc6EE14x1E", // class name
  bases__ZN3ccc6EE14x1E, 1,
  &(vtc__ZN3ccc6EE14x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x1E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x1E),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
namespace ccc { 
struct  EE14x2  : virtual ::ccc::AA14 {
  virtual void  efg(); // _ZN3ccc6EE14x23efgEv
  virtual void  abc(); // _ZN3ccc6EE14x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE14x23pqrEv
  ~EE14x2(); // tgen
  EE14x2(); // tgen
};
//SIG(1 _ZN3ccc6EE14x2E) C1{ VBC2{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x23efgEv");}
void  ccc::EE14x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x23abcEv");}
void  ccc::EE14x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x23pqrEv");}
ccc::EE14x2 ::~EE14x2(){ note_dtor("_ZN3ccc6EE14x2E", this);} // tgen
ccc::EE14x2 ::EE14x2(){ note_ctor("_ZN3ccc6EE14x2E", this);} // tgen
}
static void Test__ZN3ccc6EE14x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x2E, buf);
    ::ccc::EE14x2 *dp, &lv = *(dp=new (buf) ::ccc::EE14x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x2E);
    dp->::ccc::EE14x2::~EE14x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x2E(Test__ZN3ccc6EE14x2E, "_ZN3ccc6EE14x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x2C1Ev();
extern void _ZN3ccc6EE14x2D1Ev();
Name_Map name_map__ZN3ccc6EE14x2E[] = {
  NSPAIR(_ZN3ccc6EE14x2C1Ev),
  NSPAIR(_ZN3ccc6EE14x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x2E[];
extern void _ZN3ccc6EE14x23pqrEv();
extern void _ZN3ccc6EE14x23efgEv();
extern void _ZN3ccc6EE14x23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x2E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x2E[] = {
  {&(_ZTVN3ccc6EE14x2E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x2E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x2E[];
Class_Descriptor cd__ZN3ccc6EE14x2E = {  "_ZN3ccc6EE14x2E", // class name
  bases__ZN3ccc6EE14x2E, 1,
  &(vtc__ZN3ccc6EE14x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x2E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x2E),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
namespace ccc { 
struct  EE14x3  : virtual ::ccc::AA14 {
  virtual void  efg(); // _ZN3ccc6EE14x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE14x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE14x33abcEv
  ~EE14x3(); // tgen
  EE14x3(); // tgen
};
//SIG(1 _ZN3ccc6EE14x3E) C1{ VBC2{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x33efgEv");}
void  ccc::EE14x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x33pqrEv");}
void  ccc::EE14x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x33abcEv");}
ccc::EE14x3 ::~EE14x3(){ note_dtor("_ZN3ccc6EE14x3E", this);} // tgen
ccc::EE14x3 ::EE14x3(){ note_ctor("_ZN3ccc6EE14x3E", this);} // tgen
}
static void Test__ZN3ccc6EE14x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x3E, buf);
    ::ccc::EE14x3 *dp, &lv = *(dp=new (buf) ::ccc::EE14x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x3E);
    dp->::ccc::EE14x3::~EE14x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x3E(Test__ZN3ccc6EE14x3E, "_ZN3ccc6EE14x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x3C1Ev();
extern void _ZN3ccc6EE14x3D1Ev();
Name_Map name_map__ZN3ccc6EE14x3E[] = {
  NSPAIR(_ZN3ccc6EE14x3C1Ev),
  NSPAIR(_ZN3ccc6EE14x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x3E[];
extern void _ZN3ccc6EE14x33pqrEv();
extern void _ZN3ccc6EE14x33efgEv();
extern void _ZN3ccc6EE14x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x3E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x3E[] = {
  {&(_ZTVN3ccc6EE14x3E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x3E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x3E[];
Class_Descriptor cd__ZN3ccc6EE14x3E = {  "_ZN3ccc6EE14x3E", // class name
  bases__ZN3ccc6EE14x3E, 1,
  &(vtc__ZN3ccc6EE14x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x3E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x3E),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
namespace ccc { 
struct  EE14x4  : virtual ::ccc::AA14 {
  virtual void  pqr(); // _ZN3ccc6EE14x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE14x43abcEv
  virtual void  efg(); // _ZN3ccc6EE14x43efgEv
  ~EE14x4(); // tgen
  EE14x4(); // tgen
};
//SIG(1 _ZN3ccc6EE14x4E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x43pqrEv");}
void  ccc::EE14x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x43abcEv");}
void  ccc::EE14x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x43efgEv");}
ccc::EE14x4 ::~EE14x4(){ note_dtor("_ZN3ccc6EE14x4E", this);} // tgen
ccc::EE14x4 ::EE14x4(){ note_ctor("_ZN3ccc6EE14x4E", this);} // tgen
}
static void Test__ZN3ccc6EE14x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x4E, buf);
    ::ccc::EE14x4 *dp, &lv = *(dp=new (buf) ::ccc::EE14x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x4E);
    dp->::ccc::EE14x4::~EE14x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x4E(Test__ZN3ccc6EE14x4E, "_ZN3ccc6EE14x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x4C1Ev();
extern void _ZN3ccc6EE14x4D1Ev();
Name_Map name_map__ZN3ccc6EE14x4E[] = {
  NSPAIR(_ZN3ccc6EE14x4C1Ev),
  NSPAIR(_ZN3ccc6EE14x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x4E[];
extern void _ZN3ccc6EE14x43pqrEv();
extern void _ZN3ccc6EE14x43abcEv();
extern void _ZN3ccc6EE14x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x4E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x4E[] = {
  {&(_ZTVN3ccc6EE14x4E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x4E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x4E[];
Class_Descriptor cd__ZN3ccc6EE14x4E = {  "_ZN3ccc6EE14x4E", // class name
  bases__ZN3ccc6EE14x4E, 1,
  &(vtc__ZN3ccc6EE14x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x4E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x4E),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
namespace ccc { 
struct  EE14x5  : virtual ::ccc::AA14 {
  virtual void  pqr(); // _ZN3ccc6EE14x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE14x53efgEv
  virtual void  abc(); // _ZN3ccc6EE14x53abcEv
  ~EE14x5(); // tgen
  EE14x5(); // tgen
};
//SIG(1 _ZN3ccc6EE14x5E) C1{ VBC2{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE14x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x53pqrEv");}
void  ccc::EE14x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x53efgEv");}
void  ccc::EE14x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x53abcEv");}
ccc::EE14x5 ::~EE14x5(){ note_dtor("_ZN3ccc6EE14x5E", this);} // tgen
ccc::EE14x5 ::EE14x5(){ note_ctor("_ZN3ccc6EE14x5E", this);} // tgen
}
static void Test__ZN3ccc6EE14x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x5E, buf);
    ::ccc::EE14x5 *dp, &lv = *(dp=new (buf) ::ccc::EE14x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x5E);
    dp->::ccc::EE14x5::~EE14x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x5E(Test__ZN3ccc6EE14x5E, "_ZN3ccc6EE14x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x5C1Ev();
extern void _ZN3ccc6EE14x5D1Ev();
Name_Map name_map__ZN3ccc6EE14x5E[] = {
  NSPAIR(_ZN3ccc6EE14x5C1Ev),
  NSPAIR(_ZN3ccc6EE14x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x5E[];
extern void _ZN3ccc6EE14x53pqrEv();
extern void _ZN3ccc6EE14x53efgEv();
extern void _ZN3ccc6EE14x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x5E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x5E[] = {
  {&(_ZTVN3ccc6EE14x5E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x5E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x5E[];
Class_Descriptor cd__ZN3ccc6EE14x5E = {  "_ZN3ccc6EE14x5E", // class name
  bases__ZN3ccc6EE14x5E, 1,
  &(vtc__ZN3ccc6EE14x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x5E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x5E),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
namespace ccc { 
struct  EE14x6  : virtual ::ccc::AA14 {
  virtual void  abc(); // _ZN3ccc6EE14x63abcEv
  virtual void  efg(); // _ZN3ccc6EE14x63efgEv
  ~EE14x6(); // tgen
  EE14x6(); // tgen
};
//SIG(1 _ZN3ccc6EE14x6E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE14x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x63abcEv");}
void  ccc::EE14x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x63efgEv");}
ccc::EE14x6 ::~EE14x6(){ note_dtor("_ZN3ccc6EE14x6E", this);} // tgen
ccc::EE14x6 ::EE14x6(){ note_ctor("_ZN3ccc6EE14x6E", this);} // tgen
}
static void Test__ZN3ccc6EE14x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x6E, buf);
    ::ccc::EE14x6 *dp, &lv = *(dp=new (buf) ::ccc::EE14x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x6E);
    dp->::ccc::EE14x6::~EE14x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x6E(Test__ZN3ccc6EE14x6E, "_ZN3ccc6EE14x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x6C1Ev();
extern void _ZN3ccc6EE14x6D1Ev();
Name_Map name_map__ZN3ccc6EE14x6E[] = {
  NSPAIR(_ZN3ccc6EE14x6C1Ev),
  NSPAIR(_ZN3ccc6EE14x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc6EE14x63abcEv();
extern void _ZN3ccc6EE14x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x6E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x6E[] = {
  {&(_ZTVN3ccc6EE14x6E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x6E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x6E[];
Class_Descriptor cd__ZN3ccc6EE14x6E = {  "_ZN3ccc6EE14x6E", // class name
  bases__ZN3ccc6EE14x6E, 1,
  &(vtc__ZN3ccc6EE14x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x6E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x6E),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
namespace ccc { 
struct  EE14x7  : virtual ::ccc::AA14 {
  virtual void  abc(); // _ZN3ccc6EE14x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE14x73pqrEv
  ~EE14x7(); // tgen
  EE14x7(); // tgen
};
//SIG(1 _ZN3ccc6EE14x7E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE14x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x73abcEv");}
void  ccc::EE14x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x73pqrEv");}
ccc::EE14x7 ::~EE14x7(){ note_dtor("_ZN3ccc6EE14x7E", this);} // tgen
ccc::EE14x7 ::EE14x7(){ note_ctor("_ZN3ccc6EE14x7E", this);} // tgen
}
static void Test__ZN3ccc6EE14x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x7E, buf);
    ::ccc::EE14x7 *dp, &lv = *(dp=new (buf) ::ccc::EE14x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x7E);
    dp->::ccc::EE14x7::~EE14x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x7E(Test__ZN3ccc6EE14x7E, "_ZN3ccc6EE14x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x7C1Ev();
extern void _ZN3ccc6EE14x7D1Ev();
Name_Map name_map__ZN3ccc6EE14x7E[] = {
  NSPAIR(_ZN3ccc6EE14x7C1Ev),
  NSPAIR(_ZN3ccc6EE14x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x7E[];
extern void _ZN3ccc6EE14x73pqrEv();
extern void _ZN3ccc6EE14x73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x7E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x7E[] = {
  {&(_ZTVN3ccc6EE14x7E[4]),  4,6},
  {&(_ZTVN3ccc6EE14x7E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x7E[];
Class_Descriptor cd__ZN3ccc6EE14x7E = {  "_ZN3ccc6EE14x7E", // class name
  bases__ZN3ccc6EE14x7E, 1,
  &(vtc__ZN3ccc6EE14x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x7E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x7E),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
namespace ccc { 
struct  EE14x8  : virtual ::ccc::AA14 {
  virtual void  efg(); // _ZN3ccc6EE14x83efgEv
  virtual void  abc(); // _ZN3ccc6EE14x83abcEv
  ~EE14x8(); // tgen
  EE14x8(); // tgen
};
//SIG(1 _ZN3ccc6EE14x8E) C1{ VBC2{ v3} v1 v2}
}
namespace ccc { 
void  ccc::EE14x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x83efgEv");}
void  ccc::EE14x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE14x83abcEv");}
ccc::EE14x8 ::~EE14x8(){ note_dtor("_ZN3ccc6EE14x8E", this);} // tgen
ccc::EE14x8 ::EE14x8(){ note_ctor("_ZN3ccc6EE14x8E", this);} // tgen
}
static void Test__ZN3ccc6EE14x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x8E, buf);
    ::ccc::EE14x8 *dp, &lv = *(dp=new (buf) ::ccc::EE14x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x8E);
    dp->::ccc::EE14x8::~EE14x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x8E(Test__ZN3ccc6EE14x8E, "_ZN3ccc6EE14x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x8C1Ev();
extern void _ZN3ccc6EE14x8D1Ev();
Name_Map name_map__ZN3ccc6EE14x8E[] = {
  NSPAIR(_ZN3ccc6EE14x8C1Ev),
  NSPAIR(_ZN3ccc6EE14x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc6EE14x83efgEv();
extern void _ZN3ccc6EE14x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x8E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x8E[] = {
  {&(_ZTVN3ccc6EE14x8E[4]),  4,7},
  {&(_ZTVN3ccc6EE14x8E[4]),  4,7},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x8E[];
Class_Descriptor cd__ZN3ccc6EE14x8E = {  "_ZN3ccc6EE14x8E", // class name
  bases__ZN3ccc6EE14x8E, 1,
  &(vtc__ZN3ccc6EE14x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x8E),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x8E),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
namespace ccc { 
struct  EE14x9  : virtual ::ccc::AA14 {
  virtual void  efg(); // _ZN3ccc6EE14x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE14x93pqrEv
  ~EE14x9(); // tgen
  EE14x9(); // tgen
};
//SIG(1 _ZN3ccc6EE14x9E) C1{ VBC2{ v2} v1 v2}
}
namespace ccc { 
void  ccc::EE14x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE14x93efgEv");}
void  ccc::EE14x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE14x93pqrEv");}
ccc::EE14x9 ::~EE14x9(){ note_dtor("_ZN3ccc6EE14x9E", this);} // tgen
ccc::EE14x9 ::EE14x9(){ note_ctor("_ZN3ccc6EE14x9E", this);} // tgen
}
static void Test__ZN3ccc6EE14x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE14x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE14x9E, buf);
    ::ccc::EE14x9 *dp, &lv = *(dp=new (buf) ::ccc::EE14x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE14x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE14x9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc6EE14x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE14x9E);
    dp->::ccc::EE14x9::~EE14x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE14x9E(Test__ZN3ccc6EE14x9E, "_ZN3ccc6EE14x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE14x9C1Ev();
extern void _ZN3ccc6EE14x9D1Ev();
Name_Map name_map__ZN3ccc6EE14x9E[] = {
  NSPAIR(_ZN3ccc6EE14x9C1Ev),
  NSPAIR(_ZN3ccc6EE14x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc6EE14x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE14x9E[];
extern void _ZN3ccc6EE14x93pqrEv();
extern void _ZN3ccc6EE14x93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE14x9E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE14x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE14x93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE14x93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE14x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE14x9E[] = {
  {&(_ZTVN3ccc6EE14x9E[4]),  4,6},
  {&(_ZTVN3ccc6EE14x9E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE14x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE14x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE14x9E[];
Class_Descriptor cd__ZN3ccc6EE14x9E = {  "_ZN3ccc6EE14x9E", // class name
  bases__ZN3ccc6EE14x9E, 1,
  &(vtc__ZN3ccc6EE14x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE14x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE14x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE14x9E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE14x9E),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
namespace ccc { 
struct  EE14x10  : virtual ::ccc::AA14 {
  virtual void  pqr(); // _ZN3ccc7EE14x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE14x103abcEv
  ~EE14x10(); // tgen
  EE14x10(); // tgen
};
//SIG(1 _ZN3ccc7EE14x10E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE14x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE14x103pqrEv");}
void  ccc::EE14x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE14x103abcEv");}
ccc::EE14x10 ::~EE14x10(){ note_dtor("_ZN3ccc7EE14x10E", this);} // tgen
ccc::EE14x10 ::EE14x10(){ note_ctor("_ZN3ccc7EE14x10E", this);} // tgen
}
static void Test__ZN3ccc7EE14x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x10E, buf);
    ::ccc::EE14x10 *dp, &lv = *(dp=new (buf) ::ccc::EE14x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x10E);
    dp->::ccc::EE14x10::~EE14x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x10E(Test__ZN3ccc7EE14x10E, "_ZN3ccc7EE14x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x10C1Ev();
extern void _ZN3ccc7EE14x10D1Ev();
Name_Map name_map__ZN3ccc7EE14x10E[] = {
  NSPAIR(_ZN3ccc7EE14x10C1Ev),
  NSPAIR(_ZN3ccc7EE14x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x10E[];
extern void _ZN3ccc7EE14x103pqrEv();
extern void _ZN3ccc7EE14x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x10E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE14x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE14x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x10E[] = {
  {&(_ZTVN3ccc7EE14x10E[4]),  4,6},
  {&(_ZTVN3ccc7EE14x10E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x10E[];
Class_Descriptor cd__ZN3ccc7EE14x10E = {  "_ZN3ccc7EE14x10E", // class name
  bases__ZN3ccc7EE14x10E, 1,
  &(vtc__ZN3ccc7EE14x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x10E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x10E),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
namespace ccc { 
struct  EE14x11  : virtual ::ccc::AA14 {
  virtual void  pqr(); // _ZN3ccc7EE14x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE14x113efgEv
  ~EE14x11(); // tgen
  EE14x11(); // tgen
};
//SIG(1 _ZN3ccc7EE14x11E) C1{ VBC2{ v1} v1 v2}
}
namespace ccc { 
void  ccc::EE14x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE14x113pqrEv");}
void  ccc::EE14x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE14x113efgEv");}
ccc::EE14x11 ::~EE14x11(){ note_dtor("_ZN3ccc7EE14x11E", this);} // tgen
ccc::EE14x11 ::EE14x11(){ note_ctor("_ZN3ccc7EE14x11E", this);} // tgen
}
static void Test__ZN3ccc7EE14x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x11E, buf);
    ::ccc::EE14x11 *dp, &lv = *(dp=new (buf) ::ccc::EE14x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x11E);
    dp->::ccc::EE14x11::~EE14x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x11E(Test__ZN3ccc7EE14x11E, "_ZN3ccc7EE14x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x11C1Ev();
extern void _ZN3ccc7EE14x11D1Ev();
Name_Map name_map__ZN3ccc7EE14x11E[] = {
  NSPAIR(_ZN3ccc7EE14x11C1Ev),
  NSPAIR(_ZN3ccc7EE14x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x11E[];
extern void _ZN3ccc7EE14x113pqrEv();
extern void _ZN3ccc7EE14x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x11E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE14x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE14x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x11E[] = {
  {&(_ZTVN3ccc7EE14x11E[4]),  4,6},
  {&(_ZTVN3ccc7EE14x11E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x11E[];
Class_Descriptor cd__ZN3ccc7EE14x11E = {  "_ZN3ccc7EE14x11E", // class name
  bases__ZN3ccc7EE14x11E, 1,
  &(vtc__ZN3ccc7EE14x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x11E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x11E),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
namespace ccc { 
struct  EE14x12  : virtual ::ccc::AA14 {
  virtual void  abc(); // _ZN3ccc7EE14x123abcEv
  ~EE14x12(); // tgen
  EE14x12(); // tgen
};
//SIG(1 _ZN3ccc7EE14x12E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE14x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE14x123abcEv");}
ccc::EE14x12 ::~EE14x12(){ note_dtor("_ZN3ccc7EE14x12E", this);} // tgen
ccc::EE14x12 ::EE14x12(){ note_ctor("_ZN3ccc7EE14x12E", this);} // tgen
}
static void Test__ZN3ccc7EE14x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x12E, buf);
    ::ccc::EE14x12 *dp, &lv = *(dp=new (buf) ::ccc::EE14x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x12E);
    dp->::ccc::EE14x12::~EE14x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x12E(Test__ZN3ccc7EE14x12E, "_ZN3ccc7EE14x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x12C1Ev();
extern void _ZN3ccc7EE14x12D1Ev();
Name_Map name_map__ZN3ccc7EE14x12E[] = {
  NSPAIR(_ZN3ccc7EE14x12C1Ev),
  NSPAIR(_ZN3ccc7EE14x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc7EE14x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x12E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE14x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x12E[] = {
  {&(_ZTVN3ccc7EE14x12E[4]),  4,6},
  {&(_ZTVN3ccc7EE14x12E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x12E[];
Class_Descriptor cd__ZN3ccc7EE14x12E = {  "_ZN3ccc7EE14x12E", // class name
  bases__ZN3ccc7EE14x12E, 1,
  &(vtc__ZN3ccc7EE14x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x12E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x12E),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
namespace ccc { 
struct  EE14x13  : virtual ::ccc::AA14 {
  virtual void  efg(); // _ZN3ccc7EE14x133efgEv
  ~EE14x13(); // tgen
  EE14x13(); // tgen
};
//SIG(1 _ZN3ccc7EE14x13E) C1{ VBC2{ v2} v1}
}
namespace ccc { 
void  ccc::EE14x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE14x133efgEv");}
ccc::EE14x13 ::~EE14x13(){ note_dtor("_ZN3ccc7EE14x13E", this);} // tgen
ccc::EE14x13 ::EE14x13(){ note_ctor("_ZN3ccc7EE14x13E", this);} // tgen
}
static void Test__ZN3ccc7EE14x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x13E, buf);
    ::ccc::EE14x13 *dp, &lv = *(dp=new (buf) ::ccc::EE14x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x13E);
    dp->::ccc::EE14x13::~EE14x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x13E(Test__ZN3ccc7EE14x13E, "_ZN3ccc7EE14x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x13C1Ev();
extern void _ZN3ccc7EE14x13D1Ev();
Name_Map name_map__ZN3ccc7EE14x13E[] = {
  NSPAIR(_ZN3ccc7EE14x13C1Ev),
  NSPAIR(_ZN3ccc7EE14x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc7EE14x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x13E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE14x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x13E[] = {
  {&(_ZTVN3ccc7EE14x13E[4]),  4,6},
  {&(_ZTVN3ccc7EE14x13E[4]),  4,6},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x13E[];
Class_Descriptor cd__ZN3ccc7EE14x13E = {  "_ZN3ccc7EE14x13E", // class name
  bases__ZN3ccc7EE14x13E, 1,
  &(vtc__ZN3ccc7EE14x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x13E),6, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x13E),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
namespace ccc { 
struct  EE14x14  : virtual ::ccc::AA14 {
  virtual void  pqr(); // _ZN3ccc7EE14x143pqrEv
  ~EE14x14(); // tgen
  EE14x14(); // tgen
};
//SIG(1 _ZN3ccc7EE14x14E) C1{ VBC2{ v1} v1}
}
namespace ccc { 
void  ccc::EE14x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE14x143pqrEv");}
ccc::EE14x14 ::~EE14x14(){ note_dtor("_ZN3ccc7EE14x14E", this);} // tgen
ccc::EE14x14 ::EE14x14(){ note_ctor("_ZN3ccc7EE14x14E", this);} // tgen
}
static void Test__ZN3ccc7EE14x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x14E, buf);
    ::ccc::EE14x14 *dp, &lv = *(dp=new (buf) ::ccc::EE14x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x14E);
    dp->::ccc::EE14x14::~EE14x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x14E(Test__ZN3ccc7EE14x14E, "_ZN3ccc7EE14x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x14C1Ev();
extern void _ZN3ccc7EE14x14D1Ev();
Name_Map name_map__ZN3ccc7EE14x14E[] = {
  NSPAIR(_ZN3ccc7EE14x14C1Ev),
  NSPAIR(_ZN3ccc7EE14x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x14E[];
extern void _ZN3ccc7EE14x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x14E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE14x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x14E[] = {
  {&(_ZTVN3ccc7EE14x14E[4]),  4,5},
  {&(_ZTVN3ccc7EE14x14E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x14E[];
Class_Descriptor cd__ZN3ccc7EE14x14E = {  "_ZN3ccc7EE14x14E", // class name
  bases__ZN3ccc7EE14x14E, 1,
  &(vtc__ZN3ccc7EE14x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x14E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x14E),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
namespace ccc { 
struct  EE14x15  : virtual ::ccc::AA14 {
  ~EE14x15(); // tgen
  EE14x15(); // tgen
};
//SIG(1 _ZN3ccc7EE14x15E) C1{ VBC2{ v1}}
}
namespace ccc { 
ccc::EE14x15 ::~EE14x15(){ note_dtor("_ZN3ccc7EE14x15E", this);} // tgen
ccc::EE14x15 ::EE14x15(){ note_ctor("_ZN3ccc7EE14x15E", this);} // tgen
}
static void Test__ZN3ccc7EE14x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE14x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE14x15E, buf);
    ::ccc::EE14x15 *dp, &lv = *(dp=new (buf) ::ccc::EE14x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE14x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE14x15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc7EE14x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE14x15E);
    dp->::ccc::EE14x15::~EE14x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE14x15E(Test__ZN3ccc7EE14x15E, "_ZN3ccc7EE14x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE14x15C1Ev();
extern void _ZN3ccc7EE14x15D1Ev();
Name_Map name_map__ZN3ccc7EE14x15E[] = {
  NSPAIR(_ZN3ccc7EE14x15C1Ev),
  NSPAIR(_ZN3ccc7EE14x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
static Base_Class bases__ZN3ccc7EE14x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE14x15E[];
extern void _ZN3ccc4AA143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE14x15E[] = {
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE14x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE14x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE14x15E[] = {
  {&(_ZTVN3ccc7EE14x15E[4]),  4,5},
  {&(_ZTVN3ccc7EE14x15E[4]),  4,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE14x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE14x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE14x15E[];
Class_Descriptor cd__ZN3ccc7EE14x15E = {  "_ZN3ccc7EE14x15E", // class name
  bases__ZN3ccc7EE14x15E, 1,
  &(vtc__ZN3ccc7EE14x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE14x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE14x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE14x15E),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE14x15E),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
namespace ccc { 
struct  AA15  {
};
//SIG(-1 _ZN3ccc4AA15E) C1{}
}
namespace ccc { 
}
static void Test__ZN3ccc4AA15E()
{
  {
    init_simple_test("_ZN3ccc4AA15E");
    ::ccc::AA15 lv;
    check2(sizeof(lv), 1, "sizeof(_ZN3ccc4AA15E)");
    check2(__alignof__(lv), 1, "__alignof__(_ZN3ccc4AA15E)");
  }
}
static Arrange_To_Call_Me v_ZN3ccc4AA15E(Test__ZN3ccc4AA15E, "_ZN3ccc4AA15E", 1);

#else // __cplusplus

extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
VTBL_ENTRY *P__ZTIN3ccc4AA15E = _ZTIN3ccc4AA15E; 
Class_Descriptor cd__ZN3ccc4AA15E = {  "_ZN3ccc4AA15E", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTIN3ccc4AA15E),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
namespace ccc { 
struct  BB15  {
};
//SIG(1 _ZN3ccc4BB15E) C1{}
}
namespace ccc { 
}
static void Test__ZN3ccc4BB15E()
{
  {
    init_simple_test("_ZN3ccc4BB15E");
    ::ccc::BB15 lv;
    check2(sizeof(lv), 1, "sizeof(_ZN3ccc4BB15E)");
    check2(__alignof__(lv), 1, "__alignof__(_ZN3ccc4BB15E)");
  }
}
static Arrange_To_Call_Me v_ZN3ccc4BB15E(Test__ZN3ccc4BB15E, "_ZN3ccc4BB15E", 1);

#else // __cplusplus

#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x0  : virtual ::ccc::AA15 {
  virtual void  abc(); // _ZN3ccc6EE15x03abcEv
  virtual void  efg(); // _ZN3ccc6EE15x03efgEv
  virtual void  pqr(); // _ZN3ccc6EE15x03pqrEv
  ~EE15x0(); // tgen
  EE15x0(); // tgen
};
//SIG(1 _ZN3ccc6EE15x0E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x0 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x03abcEv");}
void  ccc::EE15x0 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x03efgEv");}
void  ccc::EE15x0 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x03pqrEv");}
ccc::EE15x0 ::~EE15x0(){ note_dtor("_ZN3ccc6EE15x0E", this);} // tgen
ccc::EE15x0 ::EE15x0(){ note_ctor("_ZN3ccc6EE15x0E", this);} // tgen
}
static void Test__ZN3ccc6EE15x0E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x0E, buf);
    ::ccc::EE15x0 *dp, &lv = *(dp=new (buf) ::ccc::EE15x0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x0E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x0E);
    dp->::ccc::EE15x0::~EE15x0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x0E(Test__ZN3ccc6EE15x0E, "_ZN3ccc6EE15x0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x0C1Ev();
extern void _ZN3ccc6EE15x0D1Ev();
Name_Map name_map__ZN3ccc6EE15x0E[] = {
  NSPAIR(_ZN3ccc6EE15x0C1Ev),
  NSPAIR(_ZN3ccc6EE15x0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x0E[];
extern void _ZN3ccc6EE15x03abcEv();
extern void _ZN3ccc6EE15x03efgEv();
extern void _ZN3ccc6EE15x03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x0E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x0E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x03abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x03efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x0E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x0E[] = {
  {&(_ZTVN3ccc6EE15x0E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x0E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x0E[];
Class_Descriptor cd__ZN3ccc6EE15x0E = {  "_ZN3ccc6EE15x0E", // class name
  bases__ZN3ccc6EE15x0E, 1,
  &(vtc__ZN3ccc6EE15x0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x0E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x0E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x1  : virtual ::ccc::AA15 {
  virtual void  abc(); // _ZN3ccc6EE15x13abcEv
  virtual void  pqr(); // _ZN3ccc6EE15x13pqrEv
  virtual void  efg(); // _ZN3ccc6EE15x13efgEv
  ~EE15x1(); // tgen
  EE15x1(); // tgen
};
//SIG(1 _ZN3ccc6EE15x1E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x1 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x13abcEv");}
void  ccc::EE15x1 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x13pqrEv");}
void  ccc::EE15x1 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x13efgEv");}
ccc::EE15x1 ::~EE15x1(){ note_dtor("_ZN3ccc6EE15x1E", this);} // tgen
ccc::EE15x1 ::EE15x1(){ note_ctor("_ZN3ccc6EE15x1E", this);} // tgen
}
static void Test__ZN3ccc6EE15x1E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x1E, buf);
    ::ccc::EE15x1 *dp, &lv = *(dp=new (buf) ::ccc::EE15x1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x1E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x1E);
    dp->::ccc::EE15x1::~EE15x1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x1E(Test__ZN3ccc6EE15x1E, "_ZN3ccc6EE15x1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x1C1Ev();
extern void _ZN3ccc6EE15x1D1Ev();
Name_Map name_map__ZN3ccc6EE15x1E[] = {
  NSPAIR(_ZN3ccc6EE15x1C1Ev),
  NSPAIR(_ZN3ccc6EE15x1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x1E[];
extern void _ZN3ccc6EE15x13abcEv();
extern void _ZN3ccc6EE15x13pqrEv();
extern void _ZN3ccc6EE15x13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x1E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x1E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x13abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x1E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x1E[] = {
  {&(_ZTVN3ccc6EE15x1E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x1E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x1E[];
Class_Descriptor cd__ZN3ccc6EE15x1E = {  "_ZN3ccc6EE15x1E", // class name
  bases__ZN3ccc6EE15x1E, 1,
  &(vtc__ZN3ccc6EE15x1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x1E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x1E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x2  : virtual ::ccc::AA15 {
  virtual void  efg(); // _ZN3ccc6EE15x23efgEv
  virtual void  abc(); // _ZN3ccc6EE15x23abcEv
  virtual void  pqr(); // _ZN3ccc6EE15x23pqrEv
  ~EE15x2(); // tgen
  EE15x2(); // tgen
};
//SIG(1 _ZN3ccc6EE15x2E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x2 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x23efgEv");}
void  ccc::EE15x2 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x23abcEv");}
void  ccc::EE15x2 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x23pqrEv");}
ccc::EE15x2 ::~EE15x2(){ note_dtor("_ZN3ccc6EE15x2E", this);} // tgen
ccc::EE15x2 ::EE15x2(){ note_ctor("_ZN3ccc6EE15x2E", this);} // tgen
}
static void Test__ZN3ccc6EE15x2E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x2E, buf);
    ::ccc::EE15x2 *dp, &lv = *(dp=new (buf) ::ccc::EE15x2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x2E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x2E);
    dp->::ccc::EE15x2::~EE15x2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x2E(Test__ZN3ccc6EE15x2E, "_ZN3ccc6EE15x2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x2C1Ev();
extern void _ZN3ccc6EE15x2D1Ev();
Name_Map name_map__ZN3ccc6EE15x2E[] = {
  NSPAIR(_ZN3ccc6EE15x2C1Ev),
  NSPAIR(_ZN3ccc6EE15x2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x2E[];
extern void _ZN3ccc6EE15x23efgEv();
extern void _ZN3ccc6EE15x23abcEv();
extern void _ZN3ccc6EE15x23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x2E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x2E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x23efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x23abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x2E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x2E[] = {
  {&(_ZTVN3ccc6EE15x2E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x2E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x2E[];
Class_Descriptor cd__ZN3ccc6EE15x2E = {  "_ZN3ccc6EE15x2E", // class name
  bases__ZN3ccc6EE15x2E, 1,
  &(vtc__ZN3ccc6EE15x2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x2E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x2E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x3  : virtual ::ccc::AA15 {
  virtual void  efg(); // _ZN3ccc6EE15x33efgEv
  virtual void  pqr(); // _ZN3ccc6EE15x33pqrEv
  virtual void  abc(); // _ZN3ccc6EE15x33abcEv
  ~EE15x3(); // tgen
  EE15x3(); // tgen
};
//SIG(1 _ZN3ccc6EE15x3E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x3 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x33efgEv");}
void  ccc::EE15x3 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x33pqrEv");}
void  ccc::EE15x3 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x33abcEv");}
ccc::EE15x3 ::~EE15x3(){ note_dtor("_ZN3ccc6EE15x3E", this);} // tgen
ccc::EE15x3 ::EE15x3(){ note_ctor("_ZN3ccc6EE15x3E", this);} // tgen
}
static void Test__ZN3ccc6EE15x3E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x3E, buf);
    ::ccc::EE15x3 *dp, &lv = *(dp=new (buf) ::ccc::EE15x3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x3E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x3E);
    dp->::ccc::EE15x3::~EE15x3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x3E(Test__ZN3ccc6EE15x3E, "_ZN3ccc6EE15x3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x3C1Ev();
extern void _ZN3ccc6EE15x3D1Ev();
Name_Map name_map__ZN3ccc6EE15x3E[] = {
  NSPAIR(_ZN3ccc6EE15x3C1Ev),
  NSPAIR(_ZN3ccc6EE15x3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x3E[];
extern void _ZN3ccc6EE15x33efgEv();
extern void _ZN3ccc6EE15x33pqrEv();
extern void _ZN3ccc6EE15x33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x3E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x3E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x33efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x3E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x3E[] = {
  {&(_ZTVN3ccc6EE15x3E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x3E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x3E[];
Class_Descriptor cd__ZN3ccc6EE15x3E = {  "_ZN3ccc6EE15x3E", // class name
  bases__ZN3ccc6EE15x3E, 1,
  &(vtc__ZN3ccc6EE15x3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x3E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x3E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x4  : virtual ::ccc::AA15 {
  virtual void  pqr(); // _ZN3ccc6EE15x43pqrEv
  virtual void  abc(); // _ZN3ccc6EE15x43abcEv
  virtual void  efg(); // _ZN3ccc6EE15x43efgEv
  ~EE15x4(); // tgen
  EE15x4(); // tgen
};
//SIG(1 _ZN3ccc6EE15x4E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x4 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x43pqrEv");}
void  ccc::EE15x4 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x43abcEv");}
void  ccc::EE15x4 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x43efgEv");}
ccc::EE15x4 ::~EE15x4(){ note_dtor("_ZN3ccc6EE15x4E", this);} // tgen
ccc::EE15x4 ::EE15x4(){ note_ctor("_ZN3ccc6EE15x4E", this);} // tgen
}
static void Test__ZN3ccc6EE15x4E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x4E, buf);
    ::ccc::EE15x4 *dp, &lv = *(dp=new (buf) ::ccc::EE15x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x4E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x4E);
    dp->::ccc::EE15x4::~EE15x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x4E(Test__ZN3ccc6EE15x4E, "_ZN3ccc6EE15x4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x4C1Ev();
extern void _ZN3ccc6EE15x4D1Ev();
Name_Map name_map__ZN3ccc6EE15x4E[] = {
  NSPAIR(_ZN3ccc6EE15x4C1Ev),
  NSPAIR(_ZN3ccc6EE15x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x4E[];
extern void _ZN3ccc6EE15x43pqrEv();
extern void _ZN3ccc6EE15x43abcEv();
extern void _ZN3ccc6EE15x43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x4E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x4E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x43abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x4E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x4E[] = {
  {&(_ZTVN3ccc6EE15x4E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x4E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x4E[];
Class_Descriptor cd__ZN3ccc6EE15x4E = {  "_ZN3ccc6EE15x4E", // class name
  bases__ZN3ccc6EE15x4E, 1,
  &(vtc__ZN3ccc6EE15x4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x4E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x4E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x5  : virtual ::ccc::AA15 {
  virtual void  pqr(); // _ZN3ccc6EE15x53pqrEv
  virtual void  efg(); // _ZN3ccc6EE15x53efgEv
  virtual void  abc(); // _ZN3ccc6EE15x53abcEv
  ~EE15x5(); // tgen
  EE15x5(); // tgen
};
//SIG(1 _ZN3ccc6EE15x5E) C1{ VBC2{} v1 v2 v3}
}
namespace ccc { 
void  ccc::EE15x5 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x53pqrEv");}
void  ccc::EE15x5 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x53efgEv");}
void  ccc::EE15x5 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x53abcEv");}
ccc::EE15x5 ::~EE15x5(){ note_dtor("_ZN3ccc6EE15x5E", this);} // tgen
ccc::EE15x5 ::EE15x5(){ note_ctor("_ZN3ccc6EE15x5E", this);} // tgen
}
static void Test__ZN3ccc6EE15x5E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x5E, buf);
    ::ccc::EE15x5 *dp, &lv = *(dp=new (buf) ::ccc::EE15x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x5E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x5E);
    dp->::ccc::EE15x5::~EE15x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x5E(Test__ZN3ccc6EE15x5E, "_ZN3ccc6EE15x5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x5C1Ev();
extern void _ZN3ccc6EE15x5D1Ev();
Name_Map name_map__ZN3ccc6EE15x5E[] = {
  NSPAIR(_ZN3ccc6EE15x5C1Ev),
  NSPAIR(_ZN3ccc6EE15x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x5E[];
extern void _ZN3ccc6EE15x53pqrEv();
extern void _ZN3ccc6EE15x53efgEv();
extern void _ZN3ccc6EE15x53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x5E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x5E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x53efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x5E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x5E[] = {
  {&(_ZTVN3ccc6EE15x5E[3]),  3,6},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x5E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x5E[];
Class_Descriptor cd__ZN3ccc6EE15x5E = {  "_ZN3ccc6EE15x5E", // class name
  bases__ZN3ccc6EE15x5E, 1,
  &(vtc__ZN3ccc6EE15x5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x5E),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x5E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x6  : virtual ::ccc::AA15 {
  virtual void  abc(); // _ZN3ccc6EE15x63abcEv
  virtual void  efg(); // _ZN3ccc6EE15x63efgEv
  ~EE15x6(); // tgen
  EE15x6(); // tgen
};
//SIG(1 _ZN3ccc6EE15x6E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x6 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x63abcEv");}
void  ccc::EE15x6 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x63efgEv");}
ccc::EE15x6 ::~EE15x6(){ note_dtor("_ZN3ccc6EE15x6E", this);} // tgen
ccc::EE15x6 ::EE15x6(){ note_ctor("_ZN3ccc6EE15x6E", this);} // tgen
}
static void Test__ZN3ccc6EE15x6E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x6E, buf);
    ::ccc::EE15x6 *dp, &lv = *(dp=new (buf) ::ccc::EE15x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x6E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x6E);
    dp->::ccc::EE15x6::~EE15x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x6E(Test__ZN3ccc6EE15x6E, "_ZN3ccc6EE15x6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x6C1Ev();
extern void _ZN3ccc6EE15x6D1Ev();
Name_Map name_map__ZN3ccc6EE15x6E[] = {
  NSPAIR(_ZN3ccc6EE15x6C1Ev),
  NSPAIR(_ZN3ccc6EE15x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x6E[];
extern void _ZN3ccc6EE15x63abcEv();
extern void _ZN3ccc6EE15x63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x6E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x63abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x6E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x6E[] = {
  {&(_ZTVN3ccc6EE15x6E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x6E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x6E[];
Class_Descriptor cd__ZN3ccc6EE15x6E = {  "_ZN3ccc6EE15x6E", // class name
  bases__ZN3ccc6EE15x6E, 1,
  &(vtc__ZN3ccc6EE15x6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x6E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x6E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x7  : virtual ::ccc::AA15 {
  virtual void  abc(); // _ZN3ccc6EE15x73abcEv
  virtual void  pqr(); // _ZN3ccc6EE15x73pqrEv
  ~EE15x7(); // tgen
  EE15x7(); // tgen
};
//SIG(1 _ZN3ccc6EE15x7E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x7 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x73abcEv");}
void  ccc::EE15x7 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x73pqrEv");}
ccc::EE15x7 ::~EE15x7(){ note_dtor("_ZN3ccc6EE15x7E", this);} // tgen
ccc::EE15x7 ::EE15x7(){ note_ctor("_ZN3ccc6EE15x7E", this);} // tgen
}
static void Test__ZN3ccc6EE15x7E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x7E, buf);
    ::ccc::EE15x7 *dp, &lv = *(dp=new (buf) ::ccc::EE15x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x7E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x7E);
    dp->::ccc::EE15x7::~EE15x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x7E(Test__ZN3ccc6EE15x7E, "_ZN3ccc6EE15x7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x7C1Ev();
extern void _ZN3ccc6EE15x7D1Ev();
Name_Map name_map__ZN3ccc6EE15x7E[] = {
  NSPAIR(_ZN3ccc6EE15x7C1Ev),
  NSPAIR(_ZN3ccc6EE15x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x7E[];
extern void _ZN3ccc6EE15x73abcEv();
extern void _ZN3ccc6EE15x73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x7E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x73abcEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x7E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x7E[] = {
  {&(_ZTVN3ccc6EE15x7E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x7E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x7E[];
Class_Descriptor cd__ZN3ccc6EE15x7E = {  "_ZN3ccc6EE15x7E", // class name
  bases__ZN3ccc6EE15x7E, 1,
  &(vtc__ZN3ccc6EE15x7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x7E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x7E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x8  : virtual ::ccc::AA15 {
  virtual void  efg(); // _ZN3ccc6EE15x83efgEv
  virtual void  abc(); // _ZN3ccc6EE15x83abcEv
  ~EE15x8(); // tgen
  EE15x8(); // tgen
};
//SIG(1 _ZN3ccc6EE15x8E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x8 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x83efgEv");}
void  ccc::EE15x8 ::abc(){vfunc_called(this, "_ZN3ccc6EE15x83abcEv");}
ccc::EE15x8 ::~EE15x8(){ note_dtor("_ZN3ccc6EE15x8E", this);} // tgen
ccc::EE15x8 ::EE15x8(){ note_ctor("_ZN3ccc6EE15x8E", this);} // tgen
}
static void Test__ZN3ccc6EE15x8E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x8E, buf);
    ::ccc::EE15x8 *dp, &lv = *(dp=new (buf) ::ccc::EE15x8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x8E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x8E);
    dp->::ccc::EE15x8::~EE15x8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x8E(Test__ZN3ccc6EE15x8E, "_ZN3ccc6EE15x8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x8C1Ev();
extern void _ZN3ccc6EE15x8D1Ev();
Name_Map name_map__ZN3ccc6EE15x8E[] = {
  NSPAIR(_ZN3ccc6EE15x8C1Ev),
  NSPAIR(_ZN3ccc6EE15x8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x8E[];
extern void _ZN3ccc6EE15x83efgEv();
extern void _ZN3ccc6EE15x83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x8E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x83efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x8E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x8E[] = {
  {&(_ZTVN3ccc6EE15x8E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x8E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x8E[];
Class_Descriptor cd__ZN3ccc6EE15x8E = {  "_ZN3ccc6EE15x8E", // class name
  bases__ZN3ccc6EE15x8E, 1,
  &(vtc__ZN3ccc6EE15x8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x8E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x8E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x9  : virtual ::ccc::AA15 {
  virtual void  efg(); // _ZN3ccc6EE15x93efgEv
  virtual void  pqr(); // _ZN3ccc6EE15x93pqrEv
  ~EE15x9(); // tgen
  EE15x9(); // tgen
};
//SIG(1 _ZN3ccc6EE15x9E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x9 ::efg(){vfunc_called(this, "_ZN3ccc6EE15x93efgEv");}
void  ccc::EE15x9 ::pqr(){vfunc_called(this, "_ZN3ccc6EE15x93pqrEv");}
ccc::EE15x9 ::~EE15x9(){ note_dtor("_ZN3ccc6EE15x9E", this);} // tgen
ccc::EE15x9 ::EE15x9(){ note_ctor("_ZN3ccc6EE15x9E", this);} // tgen
}
static void Test__ZN3ccc6EE15x9E()
{
  extern Class_Descriptor cd__ZN3ccc6EE15x9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc6EE15x9E, buf);
    ::ccc::EE15x9 *dp, &lv = *(dp=new (buf) ::ccc::EE15x9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc6EE15x9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc6EE15x9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc6EE15x9E");
    test_class_info(&lv, &cd__ZN3ccc6EE15x9E);
    dp->::ccc::EE15x9::~EE15x9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc6EE15x9E(Test__ZN3ccc6EE15x9E, "_ZN3ccc6EE15x9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc6EE15x9C1Ev();
extern void _ZN3ccc6EE15x9D1Ev();
Name_Map name_map__ZN3ccc6EE15x9E[] = {
  NSPAIR(_ZN3ccc6EE15x9C1Ev),
  NSPAIR(_ZN3ccc6EE15x9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc6EE15x9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc6EE15x9E[];
extern void _ZN3ccc6EE15x93efgEv();
extern void _ZN3ccc6EE15x93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc6EE15x9E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE15x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc6EE15x93efgEv,
  (VTBL_ENTRY)&_ZN3ccc6EE15x93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc6EE15x9E[];
static  VTT_ENTRY vtt__ZN3ccc6EE15x9E[] = {
  {&(_ZTVN3ccc6EE15x9E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc6EE15x9E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE15x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE15x9E[];
Class_Descriptor cd__ZN3ccc6EE15x9E = {  "_ZN3ccc6EE15x9E", // class name
  bases__ZN3ccc6EE15x9E, 1,
  &(vtc__ZN3ccc6EE15x9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc6EE15x9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc6EE15x9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc6EE15x9E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc6EE15x9E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x10  : virtual ::ccc::AA15 {
  virtual void  pqr(); // _ZN3ccc7EE15x103pqrEv
  virtual void  abc(); // _ZN3ccc7EE15x103abcEv
  ~EE15x10(); // tgen
  EE15x10(); // tgen
};
//SIG(1 _ZN3ccc7EE15x10E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x10 ::pqr(){vfunc_called(this, "_ZN3ccc7EE15x103pqrEv");}
void  ccc::EE15x10 ::abc(){vfunc_called(this, "_ZN3ccc7EE15x103abcEv");}
ccc::EE15x10 ::~EE15x10(){ note_dtor("_ZN3ccc7EE15x10E", this);} // tgen
ccc::EE15x10 ::EE15x10(){ note_ctor("_ZN3ccc7EE15x10E", this);} // tgen
}
static void Test__ZN3ccc7EE15x10E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x10E, buf);
    ::ccc::EE15x10 *dp, &lv = *(dp=new (buf) ::ccc::EE15x10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x10E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x10E);
    dp->::ccc::EE15x10::~EE15x10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x10E(Test__ZN3ccc7EE15x10E, "_ZN3ccc7EE15x10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x10C1Ev();
extern void _ZN3ccc7EE15x10D1Ev();
Name_Map name_map__ZN3ccc7EE15x10E[] = {
  NSPAIR(_ZN3ccc7EE15x10C1Ev),
  NSPAIR(_ZN3ccc7EE15x10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x10E[];
extern void _ZN3ccc7EE15x103pqrEv();
extern void _ZN3ccc7EE15x103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE15x10E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE15x103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE15x103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x10E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x10E[] = {
  {&(_ZTVN3ccc7EE15x10E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x10E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x10E[];
Class_Descriptor cd__ZN3ccc7EE15x10E = {  "_ZN3ccc7EE15x10E", // class name
  bases__ZN3ccc7EE15x10E, 1,
  &(vtc__ZN3ccc7EE15x10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x10E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x10E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x11  : virtual ::ccc::AA15 {
  virtual void  pqr(); // _ZN3ccc7EE15x113pqrEv
  virtual void  efg(); // _ZN3ccc7EE15x113efgEv
  ~EE15x11(); // tgen
  EE15x11(); // tgen
};
//SIG(1 _ZN3ccc7EE15x11E) C1{ VBC2{} v1 v2}
}
namespace ccc { 
void  ccc::EE15x11 ::pqr(){vfunc_called(this, "_ZN3ccc7EE15x113pqrEv");}
void  ccc::EE15x11 ::efg(){vfunc_called(this, "_ZN3ccc7EE15x113efgEv");}
ccc::EE15x11 ::~EE15x11(){ note_dtor("_ZN3ccc7EE15x11E", this);} // tgen
ccc::EE15x11 ::EE15x11(){ note_ctor("_ZN3ccc7EE15x11E", this);} // tgen
}
static void Test__ZN3ccc7EE15x11E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x11E, buf);
    ::ccc::EE15x11 *dp, &lv = *(dp=new (buf) ::ccc::EE15x11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x11E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x11E);
    dp->::ccc::EE15x11::~EE15x11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x11E(Test__ZN3ccc7EE15x11E, "_ZN3ccc7EE15x11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x11C1Ev();
extern void _ZN3ccc7EE15x11D1Ev();
Name_Map name_map__ZN3ccc7EE15x11E[] = {
  NSPAIR(_ZN3ccc7EE15x11C1Ev),
  NSPAIR(_ZN3ccc7EE15x11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x11E[];
extern void _ZN3ccc7EE15x113pqrEv();
extern void _ZN3ccc7EE15x113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE15x11E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE15x113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7EE15x113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x11E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x11E[] = {
  {&(_ZTVN3ccc7EE15x11E[3]),  3,5},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x11E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x11E[];
Class_Descriptor cd__ZN3ccc7EE15x11E = {  "_ZN3ccc7EE15x11E", // class name
  bases__ZN3ccc7EE15x11E, 1,
  &(vtc__ZN3ccc7EE15x11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x11E),5, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x11E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x12  : virtual ::ccc::AA15 {
  virtual void  abc(); // _ZN3ccc7EE15x123abcEv
  ~EE15x12(); // tgen
  EE15x12(); // tgen
};
//SIG(1 _ZN3ccc7EE15x12E) C1{ VBC2{} v1}
}
namespace ccc { 
void  ccc::EE15x12 ::abc(){vfunc_called(this, "_ZN3ccc7EE15x123abcEv");}
ccc::EE15x12 ::~EE15x12(){ note_dtor("_ZN3ccc7EE15x12E", this);} // tgen
ccc::EE15x12 ::EE15x12(){ note_ctor("_ZN3ccc7EE15x12E", this);} // tgen
}
static void Test__ZN3ccc7EE15x12E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x12E, buf);
    ::ccc::EE15x12 *dp, &lv = *(dp=new (buf) ::ccc::EE15x12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x12E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x12E);
    dp->::ccc::EE15x12::~EE15x12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x12E(Test__ZN3ccc7EE15x12E, "_ZN3ccc7EE15x12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x12C1Ev();
extern void _ZN3ccc7EE15x12D1Ev();
Name_Map name_map__ZN3ccc7EE15x12E[] = {
  NSPAIR(_ZN3ccc7EE15x12C1Ev),
  NSPAIR(_ZN3ccc7EE15x12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x12E[];
extern void _ZN3ccc7EE15x123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE15x12E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE15x123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x12E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x12E[] = {
  {&(_ZTVN3ccc7EE15x12E[3]),  3,4},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x12E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x12E[];
Class_Descriptor cd__ZN3ccc7EE15x12E = {  "_ZN3ccc7EE15x12E", // class name
  bases__ZN3ccc7EE15x12E, 1,
  &(vtc__ZN3ccc7EE15x12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x12E),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x12E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x13  : virtual ::ccc::AA15 {
  virtual void  efg(); // _ZN3ccc7EE15x133efgEv
  ~EE15x13(); // tgen
  EE15x13(); // tgen
};
//SIG(1 _ZN3ccc7EE15x13E) C1{ VBC2{} v1}
}
namespace ccc { 
void  ccc::EE15x13 ::efg(){vfunc_called(this, "_ZN3ccc7EE15x133efgEv");}
ccc::EE15x13 ::~EE15x13(){ note_dtor("_ZN3ccc7EE15x13E", this);} // tgen
ccc::EE15x13 ::EE15x13(){ note_ctor("_ZN3ccc7EE15x13E", this);} // tgen
}
static void Test__ZN3ccc7EE15x13E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x13E, buf);
    ::ccc::EE15x13 *dp, &lv = *(dp=new (buf) ::ccc::EE15x13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x13E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x13E);
    dp->::ccc::EE15x13::~EE15x13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x13E(Test__ZN3ccc7EE15x13E, "_ZN3ccc7EE15x13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x13C1Ev();
extern void _ZN3ccc7EE15x13D1Ev();
Name_Map name_map__ZN3ccc7EE15x13E[] = {
  NSPAIR(_ZN3ccc7EE15x13C1Ev),
  NSPAIR(_ZN3ccc7EE15x13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x13E[];
extern void _ZN3ccc7EE15x133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE15x13E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE15x133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x13E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x13E[] = {
  {&(_ZTVN3ccc7EE15x13E[3]),  3,4},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x13E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x13E[];
Class_Descriptor cd__ZN3ccc7EE15x13E = {  "_ZN3ccc7EE15x13E", // class name
  bases__ZN3ccc7EE15x13E, 1,
  &(vtc__ZN3ccc7EE15x13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x13E),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x13E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x14  : virtual ::ccc::AA15 {
  virtual void  pqr(); // _ZN3ccc7EE15x143pqrEv
  ~EE15x14(); // tgen
  EE15x14(); // tgen
};
//SIG(1 _ZN3ccc7EE15x14E) C1{ VBC2{} v1}
}
namespace ccc { 
void  ccc::EE15x14 ::pqr(){vfunc_called(this, "_ZN3ccc7EE15x143pqrEv");}
ccc::EE15x14 ::~EE15x14(){ note_dtor("_ZN3ccc7EE15x14E", this);} // tgen
ccc::EE15x14 ::EE15x14(){ note_ctor("_ZN3ccc7EE15x14E", this);} // tgen
}
static void Test__ZN3ccc7EE15x14E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x14E, buf);
    ::ccc::EE15x14 *dp, &lv = *(dp=new (buf) ::ccc::EE15x14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x14E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x14E);
    dp->::ccc::EE15x14::~EE15x14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x14E(Test__ZN3ccc7EE15x14E, "_ZN3ccc7EE15x14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x14C1Ev();
extern void _ZN3ccc7EE15x14D1Ev();
Name_Map name_map__ZN3ccc7EE15x14E[] = {
  NSPAIR(_ZN3ccc7EE15x14C1Ev),
  NSPAIR(_ZN3ccc7EE15x14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x14E[];
extern void _ZN3ccc7EE15x143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7EE15x14E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc7EE15x143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x14E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x14E[] = {
  {&(_ZTVN3ccc7EE15x14E[3]),  3,4},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x14E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x14E[];
Class_Descriptor cd__ZN3ccc7EE15x14E = {  "_ZN3ccc7EE15x14E", // class name
  bases__ZN3ccc7EE15x14E, 1,
  &(vtc__ZN3ccc7EE15x14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x14E),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x14E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  EE15x15  : virtual ::ccc::AA15 {
  ~EE15x15(); // tgen
  EE15x15(); // tgen
};
//SIG(1 _ZN3ccc7EE15x15E) C1{ VBC2{}}
}
namespace ccc { 
ccc::EE15x15 ::~EE15x15(){ note_dtor("_ZN3ccc7EE15x15E", this);} // tgen
ccc::EE15x15 ::EE15x15(){ note_ctor("_ZN3ccc7EE15x15E", this);} // tgen
}
static void Test__ZN3ccc7EE15x15E()
{
  extern Class_Descriptor cd__ZN3ccc7EE15x15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7EE15x15E, buf);
    ::ccc::EE15x15 *dp, &lv = *(dp=new (buf) ::ccc::EE15x15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7EE15x15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7EE15x15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc7EE15x15E");
    test_class_info(&lv, &cd__ZN3ccc7EE15x15E);
    dp->::ccc::EE15x15::~EE15x15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7EE15x15E(Test__ZN3ccc7EE15x15E, "_ZN3ccc7EE15x15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7EE15x15C1Ev();
extern void _ZN3ccc7EE15x15D1Ev();
Name_Map name_map__ZN3ccc7EE15x15E[] = {
  NSPAIR(_ZN3ccc7EE15x15C1Ev),
  NSPAIR(_ZN3ccc7EE15x15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
static Base_Class bases__ZN3ccc7EE15x15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7EE15x15E[];
static  VTBL_ENTRY vtc__ZN3ccc7EE15x15E[] = {
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7EE15x15E[0]),
};
extern VTBL_ENTRY _ZTVN3ccc7EE15x15E[];
static  VTT_ENTRY vtt__ZN3ccc7EE15x15E[] = {
  {&(_ZTVN3ccc7EE15x15E[3]),  3,3},
};
extern VTBL_ENTRY _ZTIN3ccc7EE15x15E[];
extern  VTBL_ENTRY _ZTVN3ccc7EE15x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7EE15x15E[];
Class_Descriptor cd__ZN3ccc7EE15x15E = {  "_ZN3ccc7EE15x15E", // class name
  bases__ZN3ccc7EE15x15E, 1,
  &(vtc__ZN3ccc7EE15x15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7EE15x15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7EE15x15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7EE15x15E),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7EE15x15E),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y0  : virtual ::ccc::EE0x0 {
  virtual void  abc(); // _ZN3ccc7FF0x0y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y03pqrEv
  ~FF0x0y0(); // tgen
  FF0x0y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y03abcEv");}
void  ccc::FF0x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y03efgEv");}
void  ccc::FF0x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y03pqrEv");}
ccc::FF0x0y0 ::~FF0x0y0(){ note_dtor("_ZN3ccc7FF0x0y0E", this);} // tgen
ccc::FF0x0y0 ::FF0x0y0(){ note_ctor("_ZN3ccc7FF0x0y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y0E, buf);
    ::ccc::FF0x0y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y0E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y0E);
    dp->::ccc::FF0x0y0::~FF0x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y0E(Test__ZN3ccc7FF0x0y0E, "_ZN3ccc7FF0x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y0C1Ev();
extern void _ZN3ccc7FF0x0y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y0E[] = {
  NSPAIR(_ZN3ccc7FF0x0y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y0E[];
extern void _ZN3ccc7FF0x0y03abcEv();
extern void _ZN3ccc7FF0x0y03efgEv();
extern void _ZN3ccc7FF0x0y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y0E[] = {
  {&(_ZTVN3ccc7FF0x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y0E[];
static VTBL_ENTRY alt_thunk_names1[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y0E = {  "_ZN3ccc7FF0x0y0E", // class name
  bases__ZN3ccc7FF0x0y0E, 2,
  &(vtc__ZN3ccc7FF0x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y1  : virtual ::ccc::EE0x0 {
  virtual void  abc(); // _ZN3ccc7FF0x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x0y13efgEv
  ~FF0x0y1(); // tgen
  FF0x0y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y13abcEv");}
void  ccc::FF0x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y13pqrEv");}
void  ccc::FF0x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y13efgEv");}
ccc::FF0x0y1 ::~FF0x0y1(){ note_dtor("_ZN3ccc7FF0x0y1E", this);} // tgen
ccc::FF0x0y1 ::FF0x0y1(){ note_ctor("_ZN3ccc7FF0x0y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y1E, buf);
    ::ccc::FF0x0y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y1E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y1E);
    dp->::ccc::FF0x0y1::~FF0x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y1E(Test__ZN3ccc7FF0x0y1E, "_ZN3ccc7FF0x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y1C1Ev();
extern void _ZN3ccc7FF0x0y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y1E[] = {
  NSPAIR(_ZN3ccc7FF0x0y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y1E[];
extern void _ZN3ccc7FF0x0y13abcEv();
extern void _ZN3ccc7FF0x0y13efgEv();
extern void _ZN3ccc7FF0x0y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y1E[] = {
  {&(_ZTVN3ccc7FF0x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y1E[];
static VTBL_ENTRY alt_thunk_names2[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y1E = {  "_ZN3ccc7FF0x0y1E", // class name
  bases__ZN3ccc7FF0x0y1E, 2,
  &(vtc__ZN3ccc7FF0x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y2  : virtual ::ccc::EE0x0 {
  virtual void  efg(); // _ZN3ccc7FF0x0y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y23pqrEv
  ~FF0x0y2(); // tgen
  FF0x0y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y23efgEv");}
void  ccc::FF0x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y23abcEv");}
void  ccc::FF0x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y23pqrEv");}
ccc::FF0x0y2 ::~FF0x0y2(){ note_dtor("_ZN3ccc7FF0x0y2E", this);} // tgen
ccc::FF0x0y2 ::FF0x0y2(){ note_ctor("_ZN3ccc7FF0x0y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y2E, buf);
    ::ccc::FF0x0y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y2E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y2E);
    dp->::ccc::FF0x0y2::~FF0x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y2E(Test__ZN3ccc7FF0x0y2E, "_ZN3ccc7FF0x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y2C1Ev();
extern void _ZN3ccc7FF0x0y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y2E[] = {
  NSPAIR(_ZN3ccc7FF0x0y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y2E[];
extern void _ZN3ccc7FF0x0y23abcEv();
extern void _ZN3ccc7FF0x0y23efgEv();
extern void _ZN3ccc7FF0x0y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y2E[] = {
  {&(_ZTVN3ccc7FF0x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y2E[];
static VTBL_ENTRY alt_thunk_names3[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y2E = {  "_ZN3ccc7FF0x0y2E", // class name
  bases__ZN3ccc7FF0x0y2E, 2,
  &(vtc__ZN3ccc7FF0x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names3,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y3  : virtual ::ccc::EE0x0 {
  virtual void  efg(); // _ZN3ccc7FF0x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x0y33abcEv
  ~FF0x0y3(); // tgen
  FF0x0y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y33efgEv");}
void  ccc::FF0x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y33pqrEv");}
void  ccc::FF0x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y33abcEv");}
ccc::FF0x0y3 ::~FF0x0y3(){ note_dtor("_ZN3ccc7FF0x0y3E", this);} // tgen
ccc::FF0x0y3 ::FF0x0y3(){ note_ctor("_ZN3ccc7FF0x0y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y3E, buf);
    ::ccc::FF0x0y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y3E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y3E);
    dp->::ccc::FF0x0y3::~FF0x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y3E(Test__ZN3ccc7FF0x0y3E, "_ZN3ccc7FF0x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y3C1Ev();
extern void _ZN3ccc7FF0x0y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y3E[] = {
  NSPAIR(_ZN3ccc7FF0x0y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y3E[];
extern void _ZN3ccc7FF0x0y33abcEv();
extern void _ZN3ccc7FF0x0y33efgEv();
extern void _ZN3ccc7FF0x0y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y3E[] = {
  {&(_ZTVN3ccc7FF0x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y3E[];
static VTBL_ENTRY alt_thunk_names4[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y3E = {  "_ZN3ccc7FF0x0y3E", // class name
  bases__ZN3ccc7FF0x0y3E, 2,
  &(vtc__ZN3ccc7FF0x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names4,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y4  : virtual ::ccc::EE0x0 {
  virtual void  pqr(); // _ZN3ccc7FF0x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x0y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x0y43efgEv
  ~FF0x0y4(); // tgen
  FF0x0y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y43pqrEv");}
void  ccc::FF0x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y43abcEv");}
void  ccc::FF0x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y43efgEv");}
ccc::FF0x0y4 ::~FF0x0y4(){ note_dtor("_ZN3ccc7FF0x0y4E", this);} // tgen
ccc::FF0x0y4 ::FF0x0y4(){ note_ctor("_ZN3ccc7FF0x0y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y4E, buf);
    ::ccc::FF0x0y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y4E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y4E);
    dp->::ccc::FF0x0y4::~FF0x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y4E(Test__ZN3ccc7FF0x0y4E, "_ZN3ccc7FF0x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y4C1Ev();
extern void _ZN3ccc7FF0x0y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y4E[] = {
  NSPAIR(_ZN3ccc7FF0x0y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y4E[];
extern void _ZN3ccc7FF0x0y43abcEv();
extern void _ZN3ccc7FF0x0y43efgEv();
extern void _ZN3ccc7FF0x0y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y4E[] = {
  {&(_ZTVN3ccc7FF0x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y4E[];
static VTBL_ENTRY alt_thunk_names5[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y4E = {  "_ZN3ccc7FF0x0y4E", // class name
  bases__ZN3ccc7FF0x0y4E, 2,
  &(vtc__ZN3ccc7FF0x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names5,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y5  : virtual ::ccc::EE0x0 {
  virtual void  pqr(); // _ZN3ccc7FF0x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x0y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x0y53abcEv
  ~FF0x0y5(); // tgen
  FF0x0y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y53pqrEv");}
void  ccc::FF0x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y53efgEv");}
void  ccc::FF0x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y53abcEv");}
ccc::FF0x0y5 ::~FF0x0y5(){ note_dtor("_ZN3ccc7FF0x0y5E", this);} // tgen
ccc::FF0x0y5 ::FF0x0y5(){ note_ctor("_ZN3ccc7FF0x0y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y5E, buf);
    ::ccc::FF0x0y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y5E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y5E);
    dp->::ccc::FF0x0y5::~FF0x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y5E(Test__ZN3ccc7FF0x0y5E, "_ZN3ccc7FF0x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y5C1Ev();
extern void _ZN3ccc7FF0x0y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y5E[] = {
  NSPAIR(_ZN3ccc7FF0x0y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y5E[];
extern void _ZN3ccc7FF0x0y53abcEv();
extern void _ZN3ccc7FF0x0y53efgEv();
extern void _ZN3ccc7FF0x0y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y5E[] = {
  {&(_ZTVN3ccc7FF0x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y5E[];
static VTBL_ENTRY alt_thunk_names6[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y5E = {  "_ZN3ccc7FF0x0y5E", // class name
  bases__ZN3ccc7FF0x0y5E, 2,
  &(vtc__ZN3ccc7FF0x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names6,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y6  : virtual ::ccc::EE0x0 {
  virtual void  abc(); // _ZN3ccc7FF0x0y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x0y63efgEv
  ~FF0x0y6(); // tgen
  FF0x0y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y63abcEv");}
void  ccc::FF0x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y63efgEv");}
ccc::FF0x0y6 ::~FF0x0y6(){ note_dtor("_ZN3ccc7FF0x0y6E", this);} // tgen
ccc::FF0x0y6 ::FF0x0y6(){ note_ctor("_ZN3ccc7FF0x0y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y6E, buf);
    ::ccc::FF0x0y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y6E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y6E);
    dp->::ccc::FF0x0y6::~FF0x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y6E(Test__ZN3ccc7FF0x0y6E, "_ZN3ccc7FF0x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y6C1Ev();
extern void _ZN3ccc7FF0x0y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y6E[] = {
  NSPAIR(_ZN3ccc7FF0x0y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y6E[];
extern void _ZN3ccc7FF0x0y63abcEv();
extern void _ZN3ccc7FF0x0y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y6E[] = {
  {&(_ZTVN3ccc7FF0x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y6E[];
static VTBL_ENTRY alt_thunk_names7[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y6E = {  "_ZN3ccc7FF0x0y6E", // class name
  bases__ZN3ccc7FF0x0y6E, 2,
  &(vtc__ZN3ccc7FF0x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names7,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y7  : virtual ::ccc::EE0x0 {
  virtual void  abc(); // _ZN3ccc7FF0x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y73pqrEv
  ~FF0x0y7(); // tgen
  FF0x0y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y73abcEv");}
void  ccc::FF0x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y73pqrEv");}
ccc::FF0x0y7 ::~FF0x0y7(){ note_dtor("_ZN3ccc7FF0x0y7E", this);} // tgen
ccc::FF0x0y7 ::FF0x0y7(){ note_ctor("_ZN3ccc7FF0x0y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y7E, buf);
    ::ccc::FF0x0y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y7E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y7E);
    dp->::ccc::FF0x0y7::~FF0x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y7E(Test__ZN3ccc7FF0x0y7E, "_ZN3ccc7FF0x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y7C1Ev();
extern void _ZN3ccc7FF0x0y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y7E[] = {
  NSPAIR(_ZN3ccc7FF0x0y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y7E[];
extern void _ZN3ccc7FF0x0y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x0y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y7E[] = {
  {&(_ZTVN3ccc7FF0x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y7E[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y7E = {  "_ZN3ccc7FF0x0y7E", // class name
  bases__ZN3ccc7FF0x0y7E, 2,
  &(vtc__ZN3ccc7FF0x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names8,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y8  : virtual ::ccc::EE0x0 {
  virtual void  efg(); // _ZN3ccc7FF0x0y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x0y83abcEv
  ~FF0x0y8(); // tgen
  FF0x0y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y83efgEv");}
void  ccc::FF0x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x0y83abcEv");}
ccc::FF0x0y8 ::~FF0x0y8(){ note_dtor("_ZN3ccc7FF0x0y8E", this);} // tgen
ccc::FF0x0y8 ::FF0x0y8(){ note_ctor("_ZN3ccc7FF0x0y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y8E, buf);
    ::ccc::FF0x0y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y8E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y8E);
    dp->::ccc::FF0x0y8::~FF0x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y8E(Test__ZN3ccc7FF0x0y8E, "_ZN3ccc7FF0x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y8C1Ev();
extern void _ZN3ccc7FF0x0y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y8E[] = {
  NSPAIR(_ZN3ccc7FF0x0y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y8E[];
extern void _ZN3ccc7FF0x0y83abcEv();
extern void _ZN3ccc7FF0x0y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y8E[] = {
  {&(_ZTVN3ccc7FF0x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y8E[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y8E = {  "_ZN3ccc7FF0x0y8E", // class name
  bases__ZN3ccc7FF0x0y8E, 2,
  &(vtc__ZN3ccc7FF0x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names9,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y9  : virtual ::ccc::EE0x0 {
  virtual void  efg(); // _ZN3ccc7FF0x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x0y93pqrEv
  ~FF0x0y9(); // tgen
  FF0x0y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x0y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x0y93efgEv");}
void  ccc::FF0x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x0y93pqrEv");}
ccc::FF0x0y9 ::~FF0x0y9(){ note_dtor("_ZN3ccc7FF0x0y9E", this);} // tgen
ccc::FF0x0y9 ::FF0x0y9(){ note_ctor("_ZN3ccc7FF0x0y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x0y9E, buf);
    ::ccc::FF0x0y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x0y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y9E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc7FF0x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x0y9E);
    dp->::ccc::FF0x0y9::~FF0x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x0y9E(Test__ZN3ccc7FF0x0y9E, "_ZN3ccc7FF0x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x0y9C1Ev();
extern void _ZN3ccc7FF0x0y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x0y9E[] = {
  NSPAIR(_ZN3ccc7FF0x0y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc7FF0x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x0y93efgEv();
extern void _ZN3ccc7FF0x0y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x0y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x0y9E[] = {
  {&(_ZTVN3ccc7FF0x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x0y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_7FF0x0y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x0y9E[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x0y9E = {  "_ZN3ccc7FF0x0y9E", // class name
  bases__ZN3ccc7FF0x0y9E, 2,
  &(vtc__ZN3ccc7FF0x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x0y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x0y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x0y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x0y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names10,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y10  : virtual ::ccc::EE0x0 {
  virtual void  pqr(); // _ZN3ccc8FF0x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x0y103abcEv
  ~FF0x0y10(); // tgen
  FF0x0y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x0y103pqrEv");}
void  ccc::FF0x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x0y103abcEv");}
ccc::FF0x0y10 ::~FF0x0y10(){ note_dtor("_ZN3ccc8FF0x0y10E", this);} // tgen
ccc::FF0x0y10 ::FF0x0y10(){ note_ctor("_ZN3ccc8FF0x0y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y10E, buf);
    ::ccc::FF0x0y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y10E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y10E);
    dp->::ccc::FF0x0y10::~FF0x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y10E(Test__ZN3ccc8FF0x0y10E, "_ZN3ccc8FF0x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y10C1Ev();
extern void _ZN3ccc8FF0x0y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y10E[] = {
  NSPAIR(_ZN3ccc8FF0x0y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y10E[];
extern void _ZN3ccc8FF0x0y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x0y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y10E[] = {
  {&(_ZTVN3ccc8FF0x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y10E[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y10E = {  "_ZN3ccc8FF0x0y10E", // class name
  bases__ZN3ccc8FF0x0y10E, 2,
  &(vtc__ZN3ccc8FF0x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names11,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y11  : virtual ::ccc::EE0x0 {
  virtual void  pqr(); // _ZN3ccc8FF0x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x0y113efgEv
  ~FF0x0y11(); // tgen
  FF0x0y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x0y113pqrEv");}
void  ccc::FF0x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x0y113efgEv");}
ccc::FF0x0y11 ::~FF0x0y11(){ note_dtor("_ZN3ccc8FF0x0y11E", this);} // tgen
ccc::FF0x0y11 ::FF0x0y11(){ note_ctor("_ZN3ccc8FF0x0y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y11E, buf);
    ::ccc::FF0x0y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y11E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y11E);
    dp->::ccc::FF0x0y11::~FF0x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y11E(Test__ZN3ccc8FF0x0y11E, "_ZN3ccc8FF0x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y11C1Ev();
extern void _ZN3ccc8FF0x0y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y11E[] = {
  NSPAIR(_ZN3ccc8FF0x0y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x0y113efgEv();
extern void _ZN3ccc8FF0x0y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y11E[] = {
  {&(_ZTVN3ccc8FF0x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y11E[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y11E = {  "_ZN3ccc8FF0x0y11E", // class name
  bases__ZN3ccc8FF0x0y11E, 2,
  &(vtc__ZN3ccc8FF0x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names12,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y12  : virtual ::ccc::EE0x0 {
  virtual void  abc(); // _ZN3ccc8FF0x0y123abcEv
  ~FF0x0y12(); // tgen
  FF0x0y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x0y123abcEv");}
ccc::FF0x0y12 ::~FF0x0y12(){ note_dtor("_ZN3ccc8FF0x0y12E", this);} // tgen
ccc::FF0x0y12 ::FF0x0y12(){ note_ctor("_ZN3ccc8FF0x0y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y12E, buf);
    ::ccc::FF0x0y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y12E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y12E);
    dp->::ccc::FF0x0y12::~FF0x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y12E(Test__ZN3ccc8FF0x0y12E, "_ZN3ccc8FF0x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y12C1Ev();
extern void _ZN3ccc8FF0x0y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y12E[] = {
  NSPAIR(_ZN3ccc8FF0x0y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y12E[];
extern void _ZN3ccc8FF0x0y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y12E[] = {
  {&(_ZTVN3ccc8FF0x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y12E[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y12E = {  "_ZN3ccc8FF0x0y12E", // class name
  bases__ZN3ccc8FF0x0y12E, 2,
  &(vtc__ZN3ccc8FF0x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names13,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y13  : virtual ::ccc::EE0x0 {
  virtual void  efg(); // _ZN3ccc8FF0x0y133efgEv
  ~FF0x0y13(); // tgen
  FF0x0y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x0y133efgEv");}
ccc::FF0x0y13 ::~FF0x0y13(){ note_dtor("_ZN3ccc8FF0x0y13E", this);} // tgen
ccc::FF0x0y13 ::FF0x0y13(){ note_ctor("_ZN3ccc8FF0x0y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y13E, buf);
    ::ccc::FF0x0y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y13E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y13E);
    dp->::ccc::FF0x0y13::~FF0x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y13E(Test__ZN3ccc8FF0x0y13E, "_ZN3ccc8FF0x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y13C1Ev();
extern void _ZN3ccc8FF0x0y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y13E[] = {
  NSPAIR(_ZN3ccc8FF0x0y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x0y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y13E[] = {
  {&(_ZTVN3ccc8FF0x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y13E[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y13E = {  "_ZN3ccc8FF0x0y13E", // class name
  bases__ZN3ccc8FF0x0y13E, 2,
  &(vtc__ZN3ccc8FF0x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names14,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y14  : virtual ::ccc::EE0x0 {
  virtual void  pqr(); // _ZN3ccc8FF0x0y143pqrEv
  ~FF0x0y14(); // tgen
  FF0x0y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x0y143pqrEv");}
ccc::FF0x0y14 ::~FF0x0y14(){ note_dtor("_ZN3ccc8FF0x0y14E", this);} // tgen
ccc::FF0x0y14 ::FF0x0y14(){ note_ctor("_ZN3ccc8FF0x0y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y14E, buf);
    ::ccc::FF0x0y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y14E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y14E);
    dp->::ccc::FF0x0y14::~FF0x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y14E(Test__ZN3ccc8FF0x0y14E, "_ZN3ccc8FF0x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y14C1Ev();
extern void _ZN3ccc8FF0x0y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y14E[] = {
  NSPAIR(_ZN3ccc8FF0x0y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x0y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x0y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y14E[] = {
  {&(_ZTVN3ccc8FF0x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y14E[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y14E = {  "_ZN3ccc8FF0x0y14E", // class name
  bases__ZN3ccc8FF0x0y14E, 2,
  &(vtc__ZN3ccc8FF0x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names15,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x0y15  : virtual ::ccc::EE0x0 {
  ~FF0x0y15(); // tgen
  FF0x0y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x0y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x0y15 ::~FF0x0y15(){ note_dtor("_ZN3ccc8FF0x0y15E", this);} // tgen
ccc::FF0x0y15 ::FF0x0y15(){ note_ctor("_ZN3ccc8FF0x0y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x0y15E, buf);
    ::ccc::FF0x0y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x0y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y15E");
    check_base_class_offset(lv, (::ccc::EE0x0*), 0, "_ZN3ccc8FF0x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x0y15E);
    dp->::ccc::FF0x0y15::~FF0x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x0y15E(Test__ZN3ccc8FF0x0y15E, "_ZN3ccc8FF0x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x0y15C1Ev();
extern void _ZN3ccc8FF0x0y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x0y15E[] = {
  NSPAIR(_ZN3ccc8FF0x0y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x0E[];
static Base_Class bases__ZN3ccc8FF0x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x0y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv)();
extern void _ZN3ccc5EE0x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv)();
extern void _ZN3ccc5EE0x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv)();
extern void _ZN3ccc5EE0x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x0y15E[] = {
  {&(_ZTVN3ccc8FF0x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x0y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x0E__NS_8FF0x0y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x0y15E[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x03pqrEv,_ZTv0_n20_N3ccc5EE0x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x03efgEv,_ZTv0_n16_N3ccc5EE0x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x03abcEv,_ZTv0_n12_N3ccc5EE0x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x0y15E = {  "_ZN3ccc8FF0x0y15E", // class name
  bases__ZN3ccc8FF0x0y15E, 2,
  &(vtc__ZN3ccc8FF0x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x0y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x0y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x0y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x0y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names16,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y0  : virtual ::ccc::EE0x1 {
  virtual void  abc(); // _ZN3ccc7FF0x1y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y03pqrEv
  ~FF0x1y0(); // tgen
  FF0x1y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y03abcEv");}
void  ccc::FF0x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y03efgEv");}
void  ccc::FF0x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y03pqrEv");}
ccc::FF0x1y0 ::~FF0x1y0(){ note_dtor("_ZN3ccc7FF0x1y0E", this);} // tgen
ccc::FF0x1y0 ::FF0x1y0(){ note_ctor("_ZN3ccc7FF0x1y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y0E, buf);
    ::ccc::FF0x1y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y0E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y0E);
    dp->::ccc::FF0x1y0::~FF0x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y0E(Test__ZN3ccc7FF0x1y0E, "_ZN3ccc7FF0x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y0C1Ev();
extern void _ZN3ccc7FF0x1y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y0E[] = {
  NSPAIR(_ZN3ccc7FF0x1y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y0E[];
extern void _ZN3ccc7FF0x1y03abcEv();
extern void _ZN3ccc7FF0x1y03efgEv();
extern void _ZN3ccc7FF0x1y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y0E[] = {
  {&(_ZTVN3ccc7FF0x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y0E[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y0E = {  "_ZN3ccc7FF0x1y0E", // class name
  bases__ZN3ccc7FF0x1y0E, 2,
  &(vtc__ZN3ccc7FF0x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names17,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y1  : virtual ::ccc::EE0x1 {
  virtual void  abc(); // _ZN3ccc7FF0x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x1y13efgEv
  ~FF0x1y1(); // tgen
  FF0x1y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y13abcEv");}
void  ccc::FF0x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y13pqrEv");}
void  ccc::FF0x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y13efgEv");}
ccc::FF0x1y1 ::~FF0x1y1(){ note_dtor("_ZN3ccc7FF0x1y1E", this);} // tgen
ccc::FF0x1y1 ::FF0x1y1(){ note_ctor("_ZN3ccc7FF0x1y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y1E, buf);
    ::ccc::FF0x1y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y1E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y1E);
    dp->::ccc::FF0x1y1::~FF0x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y1E(Test__ZN3ccc7FF0x1y1E, "_ZN3ccc7FF0x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y1C1Ev();
extern void _ZN3ccc7FF0x1y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y1E[] = {
  NSPAIR(_ZN3ccc7FF0x1y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y1E[];
extern void _ZN3ccc7FF0x1y13abcEv();
extern void _ZN3ccc7FF0x1y13efgEv();
extern void _ZN3ccc7FF0x1y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y1E[] = {
  {&(_ZTVN3ccc7FF0x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y1E[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y1E = {  "_ZN3ccc7FF0x1y1E", // class name
  bases__ZN3ccc7FF0x1y1E, 2,
  &(vtc__ZN3ccc7FF0x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names18,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y2  : virtual ::ccc::EE0x1 {
  virtual void  efg(); // _ZN3ccc7FF0x1y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y23pqrEv
  ~FF0x1y2(); // tgen
  FF0x1y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y23efgEv");}
void  ccc::FF0x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y23abcEv");}
void  ccc::FF0x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y23pqrEv");}
ccc::FF0x1y2 ::~FF0x1y2(){ note_dtor("_ZN3ccc7FF0x1y2E", this);} // tgen
ccc::FF0x1y2 ::FF0x1y2(){ note_ctor("_ZN3ccc7FF0x1y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y2E, buf);
    ::ccc::FF0x1y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y2E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y2E);
    dp->::ccc::FF0x1y2::~FF0x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y2E(Test__ZN3ccc7FF0x1y2E, "_ZN3ccc7FF0x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y2C1Ev();
extern void _ZN3ccc7FF0x1y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y2E[] = {
  NSPAIR(_ZN3ccc7FF0x1y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y2E[];
extern void _ZN3ccc7FF0x1y23abcEv();
extern void _ZN3ccc7FF0x1y23efgEv();
extern void _ZN3ccc7FF0x1y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y2E[] = {
  {&(_ZTVN3ccc7FF0x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y2E[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y2E = {  "_ZN3ccc7FF0x1y2E", // class name
  bases__ZN3ccc7FF0x1y2E, 2,
  &(vtc__ZN3ccc7FF0x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names19,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y3  : virtual ::ccc::EE0x1 {
  virtual void  efg(); // _ZN3ccc7FF0x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x1y33abcEv
  ~FF0x1y3(); // tgen
  FF0x1y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y33efgEv");}
void  ccc::FF0x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y33pqrEv");}
void  ccc::FF0x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y33abcEv");}
ccc::FF0x1y3 ::~FF0x1y3(){ note_dtor("_ZN3ccc7FF0x1y3E", this);} // tgen
ccc::FF0x1y3 ::FF0x1y3(){ note_ctor("_ZN3ccc7FF0x1y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y3E, buf);
    ::ccc::FF0x1y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y3E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y3E);
    dp->::ccc::FF0x1y3::~FF0x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y3E(Test__ZN3ccc7FF0x1y3E, "_ZN3ccc7FF0x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y3C1Ev();
extern void _ZN3ccc7FF0x1y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y3E[] = {
  NSPAIR(_ZN3ccc7FF0x1y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y3E[];
extern void _ZN3ccc7FF0x1y33abcEv();
extern void _ZN3ccc7FF0x1y33efgEv();
extern void _ZN3ccc7FF0x1y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y3E[] = {
  {&(_ZTVN3ccc7FF0x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y3E[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y3E = {  "_ZN3ccc7FF0x1y3E", // class name
  bases__ZN3ccc7FF0x1y3E, 2,
  &(vtc__ZN3ccc7FF0x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names20,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y4  : virtual ::ccc::EE0x1 {
  virtual void  pqr(); // _ZN3ccc7FF0x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x1y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x1y43efgEv
  ~FF0x1y4(); // tgen
  FF0x1y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y43pqrEv");}
void  ccc::FF0x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y43abcEv");}
void  ccc::FF0x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y43efgEv");}
ccc::FF0x1y4 ::~FF0x1y4(){ note_dtor("_ZN3ccc7FF0x1y4E", this);} // tgen
ccc::FF0x1y4 ::FF0x1y4(){ note_ctor("_ZN3ccc7FF0x1y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y4E, buf);
    ::ccc::FF0x1y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y4E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y4E);
    dp->::ccc::FF0x1y4::~FF0x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y4E(Test__ZN3ccc7FF0x1y4E, "_ZN3ccc7FF0x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y4C1Ev();
extern void _ZN3ccc7FF0x1y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y4E[] = {
  NSPAIR(_ZN3ccc7FF0x1y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y4E[];
extern void _ZN3ccc7FF0x1y43abcEv();
extern void _ZN3ccc7FF0x1y43efgEv();
extern void _ZN3ccc7FF0x1y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y4E[] = {
  {&(_ZTVN3ccc7FF0x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y4E[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y4E = {  "_ZN3ccc7FF0x1y4E", // class name
  bases__ZN3ccc7FF0x1y4E, 2,
  &(vtc__ZN3ccc7FF0x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names21,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y5  : virtual ::ccc::EE0x1 {
  virtual void  pqr(); // _ZN3ccc7FF0x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x1y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x1y53abcEv
  ~FF0x1y5(); // tgen
  FF0x1y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y53pqrEv");}
void  ccc::FF0x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y53efgEv");}
void  ccc::FF0x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y53abcEv");}
ccc::FF0x1y5 ::~FF0x1y5(){ note_dtor("_ZN3ccc7FF0x1y5E", this);} // tgen
ccc::FF0x1y5 ::FF0x1y5(){ note_ctor("_ZN3ccc7FF0x1y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y5E, buf);
    ::ccc::FF0x1y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y5E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y5E);
    dp->::ccc::FF0x1y5::~FF0x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y5E(Test__ZN3ccc7FF0x1y5E, "_ZN3ccc7FF0x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y5C1Ev();
extern void _ZN3ccc7FF0x1y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y5E[] = {
  NSPAIR(_ZN3ccc7FF0x1y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y5E[];
extern void _ZN3ccc7FF0x1y53abcEv();
extern void _ZN3ccc7FF0x1y53efgEv();
extern void _ZN3ccc7FF0x1y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y5E[] = {
  {&(_ZTVN3ccc7FF0x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y5E[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y5E = {  "_ZN3ccc7FF0x1y5E", // class name
  bases__ZN3ccc7FF0x1y5E, 2,
  &(vtc__ZN3ccc7FF0x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names22,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y6  : virtual ::ccc::EE0x1 {
  virtual void  abc(); // _ZN3ccc7FF0x1y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x1y63efgEv
  ~FF0x1y6(); // tgen
  FF0x1y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y63abcEv");}
void  ccc::FF0x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y63efgEv");}
ccc::FF0x1y6 ::~FF0x1y6(){ note_dtor("_ZN3ccc7FF0x1y6E", this);} // tgen
ccc::FF0x1y6 ::FF0x1y6(){ note_ctor("_ZN3ccc7FF0x1y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y6E, buf);
    ::ccc::FF0x1y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y6E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y6E);
    dp->::ccc::FF0x1y6::~FF0x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y6E(Test__ZN3ccc7FF0x1y6E, "_ZN3ccc7FF0x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y6C1Ev();
extern void _ZN3ccc7FF0x1y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y6E[] = {
  NSPAIR(_ZN3ccc7FF0x1y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y6E[];
extern void _ZN3ccc7FF0x1y63abcEv();
extern void _ZN3ccc7FF0x1y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y6E[] = {
  {&(_ZTVN3ccc7FF0x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y6E[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y6E = {  "_ZN3ccc7FF0x1y6E", // class name
  bases__ZN3ccc7FF0x1y6E, 2,
  &(vtc__ZN3ccc7FF0x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names23,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y7  : virtual ::ccc::EE0x1 {
  virtual void  abc(); // _ZN3ccc7FF0x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y73pqrEv
  ~FF0x1y7(); // tgen
  FF0x1y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y73abcEv");}
void  ccc::FF0x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y73pqrEv");}
ccc::FF0x1y7 ::~FF0x1y7(){ note_dtor("_ZN3ccc7FF0x1y7E", this);} // tgen
ccc::FF0x1y7 ::FF0x1y7(){ note_ctor("_ZN3ccc7FF0x1y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y7E, buf);
    ::ccc::FF0x1y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y7E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y7E);
    dp->::ccc::FF0x1y7::~FF0x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y7E(Test__ZN3ccc7FF0x1y7E, "_ZN3ccc7FF0x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y7C1Ev();
extern void _ZN3ccc7FF0x1y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y7E[] = {
  NSPAIR(_ZN3ccc7FF0x1y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y7E[];
extern void _ZN3ccc7FF0x1y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x1y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y7E[] = {
  {&(_ZTVN3ccc7FF0x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y7E[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y7E = {  "_ZN3ccc7FF0x1y7E", // class name
  bases__ZN3ccc7FF0x1y7E, 2,
  &(vtc__ZN3ccc7FF0x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names24,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y8  : virtual ::ccc::EE0x1 {
  virtual void  efg(); // _ZN3ccc7FF0x1y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x1y83abcEv
  ~FF0x1y8(); // tgen
  FF0x1y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y83efgEv");}
void  ccc::FF0x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x1y83abcEv");}
ccc::FF0x1y8 ::~FF0x1y8(){ note_dtor("_ZN3ccc7FF0x1y8E", this);} // tgen
ccc::FF0x1y8 ::FF0x1y8(){ note_ctor("_ZN3ccc7FF0x1y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y8E, buf);
    ::ccc::FF0x1y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y8E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y8E);
    dp->::ccc::FF0x1y8::~FF0x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y8E(Test__ZN3ccc7FF0x1y8E, "_ZN3ccc7FF0x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y8C1Ev();
extern void _ZN3ccc7FF0x1y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y8E[] = {
  NSPAIR(_ZN3ccc7FF0x1y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y8E[];
extern void _ZN3ccc7FF0x1y83abcEv();
extern void _ZN3ccc7FF0x1y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y8E[] = {
  {&(_ZTVN3ccc7FF0x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y8E[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y8E = {  "_ZN3ccc7FF0x1y8E", // class name
  bases__ZN3ccc7FF0x1y8E, 2,
  &(vtc__ZN3ccc7FF0x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names25,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y9  : virtual ::ccc::EE0x1 {
  virtual void  efg(); // _ZN3ccc7FF0x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x1y93pqrEv
  ~FF0x1y9(); // tgen
  FF0x1y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x1y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x1y93efgEv");}
void  ccc::FF0x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x1y93pqrEv");}
ccc::FF0x1y9 ::~FF0x1y9(){ note_dtor("_ZN3ccc7FF0x1y9E", this);} // tgen
ccc::FF0x1y9 ::FF0x1y9(){ note_ctor("_ZN3ccc7FF0x1y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x1y9E, buf);
    ::ccc::FF0x1y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x1y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y9E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc7FF0x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x1y9E);
    dp->::ccc::FF0x1y9::~FF0x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x1y9E(Test__ZN3ccc7FF0x1y9E, "_ZN3ccc7FF0x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x1y9C1Ev();
extern void _ZN3ccc7FF0x1y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x1y9E[] = {
  NSPAIR(_ZN3ccc7FF0x1y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc7FF0x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x1y93efgEv();
extern void _ZN3ccc7FF0x1y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x1y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x1y9E[] = {
  {&(_ZTVN3ccc7FF0x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x1y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_7FF0x1y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x1y9E[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x1y9E = {  "_ZN3ccc7FF0x1y9E", // class name
  bases__ZN3ccc7FF0x1y9E, 2,
  &(vtc__ZN3ccc7FF0x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x1y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x1y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x1y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x1y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names26,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y10  : virtual ::ccc::EE0x1 {
  virtual void  pqr(); // _ZN3ccc8FF0x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x1y103abcEv
  ~FF0x1y10(); // tgen
  FF0x1y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x1y103pqrEv");}
void  ccc::FF0x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x1y103abcEv");}
ccc::FF0x1y10 ::~FF0x1y10(){ note_dtor("_ZN3ccc8FF0x1y10E", this);} // tgen
ccc::FF0x1y10 ::FF0x1y10(){ note_ctor("_ZN3ccc8FF0x1y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y10E, buf);
    ::ccc::FF0x1y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y10E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y10E);
    dp->::ccc::FF0x1y10::~FF0x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y10E(Test__ZN3ccc8FF0x1y10E, "_ZN3ccc8FF0x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y10C1Ev();
extern void _ZN3ccc8FF0x1y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y10E[] = {
  NSPAIR(_ZN3ccc8FF0x1y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y10E[];
extern void _ZN3ccc8FF0x1y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x1y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y10E[] = {
  {&(_ZTVN3ccc8FF0x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y10E[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y10E = {  "_ZN3ccc8FF0x1y10E", // class name
  bases__ZN3ccc8FF0x1y10E, 2,
  &(vtc__ZN3ccc8FF0x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names27,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y11  : virtual ::ccc::EE0x1 {
  virtual void  pqr(); // _ZN3ccc8FF0x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x1y113efgEv
  ~FF0x1y11(); // tgen
  FF0x1y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x1y113pqrEv");}
void  ccc::FF0x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x1y113efgEv");}
ccc::FF0x1y11 ::~FF0x1y11(){ note_dtor("_ZN3ccc8FF0x1y11E", this);} // tgen
ccc::FF0x1y11 ::FF0x1y11(){ note_ctor("_ZN3ccc8FF0x1y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y11E, buf);
    ::ccc::FF0x1y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y11E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y11E);
    dp->::ccc::FF0x1y11::~FF0x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y11E(Test__ZN3ccc8FF0x1y11E, "_ZN3ccc8FF0x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y11C1Ev();
extern void _ZN3ccc8FF0x1y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y11E[] = {
  NSPAIR(_ZN3ccc8FF0x1y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x1y113efgEv();
extern void _ZN3ccc8FF0x1y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y11E[] = {
  {&(_ZTVN3ccc8FF0x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y11E[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y11E = {  "_ZN3ccc8FF0x1y11E", // class name
  bases__ZN3ccc8FF0x1y11E, 2,
  &(vtc__ZN3ccc8FF0x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names28,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y12  : virtual ::ccc::EE0x1 {
  virtual void  abc(); // _ZN3ccc8FF0x1y123abcEv
  ~FF0x1y12(); // tgen
  FF0x1y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x1y123abcEv");}
ccc::FF0x1y12 ::~FF0x1y12(){ note_dtor("_ZN3ccc8FF0x1y12E", this);} // tgen
ccc::FF0x1y12 ::FF0x1y12(){ note_ctor("_ZN3ccc8FF0x1y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y12E, buf);
    ::ccc::FF0x1y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y12E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y12E);
    dp->::ccc::FF0x1y12::~FF0x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y12E(Test__ZN3ccc8FF0x1y12E, "_ZN3ccc8FF0x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y12C1Ev();
extern void _ZN3ccc8FF0x1y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y12E[] = {
  NSPAIR(_ZN3ccc8FF0x1y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y12E[];
extern void _ZN3ccc8FF0x1y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y12E[] = {
  {&(_ZTVN3ccc8FF0x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y12E[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y12E = {  "_ZN3ccc8FF0x1y12E", // class name
  bases__ZN3ccc8FF0x1y12E, 2,
  &(vtc__ZN3ccc8FF0x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names29,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y13  : virtual ::ccc::EE0x1 {
  virtual void  efg(); // _ZN3ccc8FF0x1y133efgEv
  ~FF0x1y13(); // tgen
  FF0x1y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x1y133efgEv");}
ccc::FF0x1y13 ::~FF0x1y13(){ note_dtor("_ZN3ccc8FF0x1y13E", this);} // tgen
ccc::FF0x1y13 ::FF0x1y13(){ note_ctor("_ZN3ccc8FF0x1y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y13E, buf);
    ::ccc::FF0x1y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y13E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y13E);
    dp->::ccc::FF0x1y13::~FF0x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y13E(Test__ZN3ccc8FF0x1y13E, "_ZN3ccc8FF0x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y13C1Ev();
extern void _ZN3ccc8FF0x1y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y13E[] = {
  NSPAIR(_ZN3ccc8FF0x1y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x1y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y13E[] = {
  {&(_ZTVN3ccc8FF0x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y13E[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y13E = {  "_ZN3ccc8FF0x1y13E", // class name
  bases__ZN3ccc8FF0x1y13E, 2,
  &(vtc__ZN3ccc8FF0x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names30,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y14  : virtual ::ccc::EE0x1 {
  virtual void  pqr(); // _ZN3ccc8FF0x1y143pqrEv
  ~FF0x1y14(); // tgen
  FF0x1y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x1y143pqrEv");}
ccc::FF0x1y14 ::~FF0x1y14(){ note_dtor("_ZN3ccc8FF0x1y14E", this);} // tgen
ccc::FF0x1y14 ::FF0x1y14(){ note_ctor("_ZN3ccc8FF0x1y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y14E, buf);
    ::ccc::FF0x1y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y14E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y14E);
    dp->::ccc::FF0x1y14::~FF0x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y14E(Test__ZN3ccc8FF0x1y14E, "_ZN3ccc8FF0x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y14C1Ev();
extern void _ZN3ccc8FF0x1y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y14E[] = {
  NSPAIR(_ZN3ccc8FF0x1y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x1y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x1y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y14E[] = {
  {&(_ZTVN3ccc8FF0x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y14E[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y14E = {  "_ZN3ccc8FF0x1y14E", // class name
  bases__ZN3ccc8FF0x1y14E, 2,
  &(vtc__ZN3ccc8FF0x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names31,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x1y15  : virtual ::ccc::EE0x1 {
  ~FF0x1y15(); // tgen
  FF0x1y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x1y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x1y15 ::~FF0x1y15(){ note_dtor("_ZN3ccc8FF0x1y15E", this);} // tgen
ccc::FF0x1y15 ::FF0x1y15(){ note_ctor("_ZN3ccc8FF0x1y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x1y15E, buf);
    ::ccc::FF0x1y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x1y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y15E");
    check_base_class_offset(lv, (::ccc::EE0x1*), 0, "_ZN3ccc8FF0x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x1y15E);
    dp->::ccc::FF0x1y15::~FF0x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x1y15E(Test__ZN3ccc8FF0x1y15E, "_ZN3ccc8FF0x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x1y15C1Ev();
extern void _ZN3ccc8FF0x1y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x1y15E[] = {
  NSPAIR(_ZN3ccc8FF0x1y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x1E[];
static Base_Class bases__ZN3ccc8FF0x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x1y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv)();
extern void _ZN3ccc5EE0x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv)();
extern void _ZN3ccc5EE0x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv)();
extern void _ZN3ccc5EE0x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x1y15E[] = {
  {&(_ZTVN3ccc8FF0x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x1y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x1E__NS_8FF0x1y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x1y15E[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x13pqrEv,_ZTv0_n20_N3ccc5EE0x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x13efgEv,_ZTv0_n16_N3ccc5EE0x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x13abcEv,_ZTv0_n12_N3ccc5EE0x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x1y15E = {  "_ZN3ccc8FF0x1y15E", // class name
  bases__ZN3ccc8FF0x1y15E, 2,
  &(vtc__ZN3ccc8FF0x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x1y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x1y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x1y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x1y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names32,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y0  : virtual ::ccc::EE0x2 {
  virtual void  abc(); // _ZN3ccc7FF0x2y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y03pqrEv
  ~FF0x2y0(); // tgen
  FF0x2y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y03abcEv");}
void  ccc::FF0x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y03efgEv");}
void  ccc::FF0x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y03pqrEv");}
ccc::FF0x2y0 ::~FF0x2y0(){ note_dtor("_ZN3ccc7FF0x2y0E", this);} // tgen
ccc::FF0x2y0 ::FF0x2y0(){ note_ctor("_ZN3ccc7FF0x2y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y0E, buf);
    ::ccc::FF0x2y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y0E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y0E);
    dp->::ccc::FF0x2y0::~FF0x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y0E(Test__ZN3ccc7FF0x2y0E, "_ZN3ccc7FF0x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y0C1Ev();
extern void _ZN3ccc7FF0x2y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y0E[] = {
  NSPAIR(_ZN3ccc7FF0x2y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y0E[];
extern void _ZN3ccc7FF0x2y03abcEv();
extern void _ZN3ccc7FF0x2y03efgEv();
extern void _ZN3ccc7FF0x2y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y0E[] = {
  {&(_ZTVN3ccc7FF0x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y0E[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y0E = {  "_ZN3ccc7FF0x2y0E", // class name
  bases__ZN3ccc7FF0x2y0E, 2,
  &(vtc__ZN3ccc7FF0x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names33,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y1  : virtual ::ccc::EE0x2 {
  virtual void  abc(); // _ZN3ccc7FF0x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x2y13efgEv
  ~FF0x2y1(); // tgen
  FF0x2y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y13abcEv");}
void  ccc::FF0x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y13pqrEv");}
void  ccc::FF0x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y13efgEv");}
ccc::FF0x2y1 ::~FF0x2y1(){ note_dtor("_ZN3ccc7FF0x2y1E", this);} // tgen
ccc::FF0x2y1 ::FF0x2y1(){ note_ctor("_ZN3ccc7FF0x2y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y1E, buf);
    ::ccc::FF0x2y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y1E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y1E);
    dp->::ccc::FF0x2y1::~FF0x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y1E(Test__ZN3ccc7FF0x2y1E, "_ZN3ccc7FF0x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y1C1Ev();
extern void _ZN3ccc7FF0x2y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y1E[] = {
  NSPAIR(_ZN3ccc7FF0x2y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y1E[];
extern void _ZN3ccc7FF0x2y13abcEv();
extern void _ZN3ccc7FF0x2y13efgEv();
extern void _ZN3ccc7FF0x2y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y1E[] = {
  {&(_ZTVN3ccc7FF0x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y1E[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y1E = {  "_ZN3ccc7FF0x2y1E", // class name
  bases__ZN3ccc7FF0x2y1E, 2,
  &(vtc__ZN3ccc7FF0x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names34,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y2  : virtual ::ccc::EE0x2 {
  virtual void  efg(); // _ZN3ccc7FF0x2y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y23pqrEv
  ~FF0x2y2(); // tgen
  FF0x2y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y23efgEv");}
void  ccc::FF0x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y23abcEv");}
void  ccc::FF0x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y23pqrEv");}
ccc::FF0x2y2 ::~FF0x2y2(){ note_dtor("_ZN3ccc7FF0x2y2E", this);} // tgen
ccc::FF0x2y2 ::FF0x2y2(){ note_ctor("_ZN3ccc7FF0x2y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y2E, buf);
    ::ccc::FF0x2y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y2E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y2E);
    dp->::ccc::FF0x2y2::~FF0x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y2E(Test__ZN3ccc7FF0x2y2E, "_ZN3ccc7FF0x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y2C1Ev();
extern void _ZN3ccc7FF0x2y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y2E[] = {
  NSPAIR(_ZN3ccc7FF0x2y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y2E[];
extern void _ZN3ccc7FF0x2y23abcEv();
extern void _ZN3ccc7FF0x2y23efgEv();
extern void _ZN3ccc7FF0x2y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y2E[] = {
  {&(_ZTVN3ccc7FF0x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y2E[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y2E = {  "_ZN3ccc7FF0x2y2E", // class name
  bases__ZN3ccc7FF0x2y2E, 2,
  &(vtc__ZN3ccc7FF0x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names35,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y3  : virtual ::ccc::EE0x2 {
  virtual void  efg(); // _ZN3ccc7FF0x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x2y33abcEv
  ~FF0x2y3(); // tgen
  FF0x2y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y33efgEv");}
void  ccc::FF0x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y33pqrEv");}
void  ccc::FF0x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y33abcEv");}
ccc::FF0x2y3 ::~FF0x2y3(){ note_dtor("_ZN3ccc7FF0x2y3E", this);} // tgen
ccc::FF0x2y3 ::FF0x2y3(){ note_ctor("_ZN3ccc7FF0x2y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y3E, buf);
    ::ccc::FF0x2y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y3E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y3E);
    dp->::ccc::FF0x2y3::~FF0x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y3E(Test__ZN3ccc7FF0x2y3E, "_ZN3ccc7FF0x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y3C1Ev();
extern void _ZN3ccc7FF0x2y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y3E[] = {
  NSPAIR(_ZN3ccc7FF0x2y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y3E[];
extern void _ZN3ccc7FF0x2y33abcEv();
extern void _ZN3ccc7FF0x2y33efgEv();
extern void _ZN3ccc7FF0x2y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y3E[] = {
  {&(_ZTVN3ccc7FF0x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y3E[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y3E = {  "_ZN3ccc7FF0x2y3E", // class name
  bases__ZN3ccc7FF0x2y3E, 2,
  &(vtc__ZN3ccc7FF0x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names36,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y4  : virtual ::ccc::EE0x2 {
  virtual void  pqr(); // _ZN3ccc7FF0x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x2y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x2y43efgEv
  ~FF0x2y4(); // tgen
  FF0x2y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y43pqrEv");}
void  ccc::FF0x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y43abcEv");}
void  ccc::FF0x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y43efgEv");}
ccc::FF0x2y4 ::~FF0x2y4(){ note_dtor("_ZN3ccc7FF0x2y4E", this);} // tgen
ccc::FF0x2y4 ::FF0x2y4(){ note_ctor("_ZN3ccc7FF0x2y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y4E, buf);
    ::ccc::FF0x2y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y4E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y4E);
    dp->::ccc::FF0x2y4::~FF0x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y4E(Test__ZN3ccc7FF0x2y4E, "_ZN3ccc7FF0x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y4C1Ev();
extern void _ZN3ccc7FF0x2y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y4E[] = {
  NSPAIR(_ZN3ccc7FF0x2y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y4E[];
extern void _ZN3ccc7FF0x2y43abcEv();
extern void _ZN3ccc7FF0x2y43efgEv();
extern void _ZN3ccc7FF0x2y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y4E[] = {
  {&(_ZTVN3ccc7FF0x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y4E[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y4E = {  "_ZN3ccc7FF0x2y4E", // class name
  bases__ZN3ccc7FF0x2y4E, 2,
  &(vtc__ZN3ccc7FF0x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names37,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y5  : virtual ::ccc::EE0x2 {
  virtual void  pqr(); // _ZN3ccc7FF0x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x2y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x2y53abcEv
  ~FF0x2y5(); // tgen
  FF0x2y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y53pqrEv");}
void  ccc::FF0x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y53efgEv");}
void  ccc::FF0x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y53abcEv");}
ccc::FF0x2y5 ::~FF0x2y5(){ note_dtor("_ZN3ccc7FF0x2y5E", this);} // tgen
ccc::FF0x2y5 ::FF0x2y5(){ note_ctor("_ZN3ccc7FF0x2y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y5E, buf);
    ::ccc::FF0x2y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y5E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y5E);
    dp->::ccc::FF0x2y5::~FF0x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y5E(Test__ZN3ccc7FF0x2y5E, "_ZN3ccc7FF0x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y5C1Ev();
extern void _ZN3ccc7FF0x2y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y5E[] = {
  NSPAIR(_ZN3ccc7FF0x2y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y5E[];
extern void _ZN3ccc7FF0x2y53abcEv();
extern void _ZN3ccc7FF0x2y53efgEv();
extern void _ZN3ccc7FF0x2y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y5E[] = {
  {&(_ZTVN3ccc7FF0x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y5E[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y5E = {  "_ZN3ccc7FF0x2y5E", // class name
  bases__ZN3ccc7FF0x2y5E, 2,
  &(vtc__ZN3ccc7FF0x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names38,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y6  : virtual ::ccc::EE0x2 {
  virtual void  abc(); // _ZN3ccc7FF0x2y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x2y63efgEv
  ~FF0x2y6(); // tgen
  FF0x2y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y63abcEv");}
void  ccc::FF0x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y63efgEv");}
ccc::FF0x2y6 ::~FF0x2y6(){ note_dtor("_ZN3ccc7FF0x2y6E", this);} // tgen
ccc::FF0x2y6 ::FF0x2y6(){ note_ctor("_ZN3ccc7FF0x2y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y6E, buf);
    ::ccc::FF0x2y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y6E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y6E);
    dp->::ccc::FF0x2y6::~FF0x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y6E(Test__ZN3ccc7FF0x2y6E, "_ZN3ccc7FF0x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y6C1Ev();
extern void _ZN3ccc7FF0x2y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y6E[] = {
  NSPAIR(_ZN3ccc7FF0x2y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y6E[];
extern void _ZN3ccc7FF0x2y63abcEv();
extern void _ZN3ccc7FF0x2y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y6E[] = {
  {&(_ZTVN3ccc7FF0x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y6E[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y6E = {  "_ZN3ccc7FF0x2y6E", // class name
  bases__ZN3ccc7FF0x2y6E, 2,
  &(vtc__ZN3ccc7FF0x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names39,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y7  : virtual ::ccc::EE0x2 {
  virtual void  abc(); // _ZN3ccc7FF0x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y73pqrEv
  ~FF0x2y7(); // tgen
  FF0x2y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y73abcEv");}
void  ccc::FF0x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y73pqrEv");}
ccc::FF0x2y7 ::~FF0x2y7(){ note_dtor("_ZN3ccc7FF0x2y7E", this);} // tgen
ccc::FF0x2y7 ::FF0x2y7(){ note_ctor("_ZN3ccc7FF0x2y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y7E, buf);
    ::ccc::FF0x2y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y7E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y7E);
    dp->::ccc::FF0x2y7::~FF0x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y7E(Test__ZN3ccc7FF0x2y7E, "_ZN3ccc7FF0x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y7C1Ev();
extern void _ZN3ccc7FF0x2y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y7E[] = {
  NSPAIR(_ZN3ccc7FF0x2y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y7E[];
extern void _ZN3ccc7FF0x2y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x2y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y7E[] = {
  {&(_ZTVN3ccc7FF0x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y7E[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y7E = {  "_ZN3ccc7FF0x2y7E", // class name
  bases__ZN3ccc7FF0x2y7E, 2,
  &(vtc__ZN3ccc7FF0x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names40,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y8  : virtual ::ccc::EE0x2 {
  virtual void  efg(); // _ZN3ccc7FF0x2y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x2y83abcEv
  ~FF0x2y8(); // tgen
  FF0x2y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y83efgEv");}
void  ccc::FF0x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x2y83abcEv");}
ccc::FF0x2y8 ::~FF0x2y8(){ note_dtor("_ZN3ccc7FF0x2y8E", this);} // tgen
ccc::FF0x2y8 ::FF0x2y8(){ note_ctor("_ZN3ccc7FF0x2y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y8E, buf);
    ::ccc::FF0x2y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y8E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y8E);
    dp->::ccc::FF0x2y8::~FF0x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y8E(Test__ZN3ccc7FF0x2y8E, "_ZN3ccc7FF0x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y8C1Ev();
extern void _ZN3ccc7FF0x2y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y8E[] = {
  NSPAIR(_ZN3ccc7FF0x2y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y8E[];
extern void _ZN3ccc7FF0x2y83abcEv();
extern void _ZN3ccc7FF0x2y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y8E[] = {
  {&(_ZTVN3ccc7FF0x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y8E[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y8E = {  "_ZN3ccc7FF0x2y8E", // class name
  bases__ZN3ccc7FF0x2y8E, 2,
  &(vtc__ZN3ccc7FF0x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names41,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y9  : virtual ::ccc::EE0x2 {
  virtual void  efg(); // _ZN3ccc7FF0x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x2y93pqrEv
  ~FF0x2y9(); // tgen
  FF0x2y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x2y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x2y93efgEv");}
void  ccc::FF0x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x2y93pqrEv");}
ccc::FF0x2y9 ::~FF0x2y9(){ note_dtor("_ZN3ccc7FF0x2y9E", this);} // tgen
ccc::FF0x2y9 ::FF0x2y9(){ note_ctor("_ZN3ccc7FF0x2y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x2y9E, buf);
    ::ccc::FF0x2y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x2y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y9E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc7FF0x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x2y9E);
    dp->::ccc::FF0x2y9::~FF0x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x2y9E(Test__ZN3ccc7FF0x2y9E, "_ZN3ccc7FF0x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x2y9C1Ev();
extern void _ZN3ccc7FF0x2y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x2y9E[] = {
  NSPAIR(_ZN3ccc7FF0x2y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc7FF0x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x2y93efgEv();
extern void _ZN3ccc7FF0x2y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x2y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x2y9E[] = {
  {&(_ZTVN3ccc7FF0x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x2y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_7FF0x2y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x2y9E[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x2y9E = {  "_ZN3ccc7FF0x2y9E", // class name
  bases__ZN3ccc7FF0x2y9E, 2,
  &(vtc__ZN3ccc7FF0x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x2y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x2y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x2y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x2y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names42,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y10  : virtual ::ccc::EE0x2 {
  virtual void  pqr(); // _ZN3ccc8FF0x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x2y103abcEv
  ~FF0x2y10(); // tgen
  FF0x2y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x2y103pqrEv");}
void  ccc::FF0x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x2y103abcEv");}
ccc::FF0x2y10 ::~FF0x2y10(){ note_dtor("_ZN3ccc8FF0x2y10E", this);} // tgen
ccc::FF0x2y10 ::FF0x2y10(){ note_ctor("_ZN3ccc8FF0x2y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y10E, buf);
    ::ccc::FF0x2y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y10E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y10E);
    dp->::ccc::FF0x2y10::~FF0x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y10E(Test__ZN3ccc8FF0x2y10E, "_ZN3ccc8FF0x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y10C1Ev();
extern void _ZN3ccc8FF0x2y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y10E[] = {
  NSPAIR(_ZN3ccc8FF0x2y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y10E[];
extern void _ZN3ccc8FF0x2y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x2y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y10E[] = {
  {&(_ZTVN3ccc8FF0x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y10E[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y10E = {  "_ZN3ccc8FF0x2y10E", // class name
  bases__ZN3ccc8FF0x2y10E, 2,
  &(vtc__ZN3ccc8FF0x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names43,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y11  : virtual ::ccc::EE0x2 {
  virtual void  pqr(); // _ZN3ccc8FF0x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x2y113efgEv
  ~FF0x2y11(); // tgen
  FF0x2y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x2y113pqrEv");}
void  ccc::FF0x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x2y113efgEv");}
ccc::FF0x2y11 ::~FF0x2y11(){ note_dtor("_ZN3ccc8FF0x2y11E", this);} // tgen
ccc::FF0x2y11 ::FF0x2y11(){ note_ctor("_ZN3ccc8FF0x2y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y11E, buf);
    ::ccc::FF0x2y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y11E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y11E);
    dp->::ccc::FF0x2y11::~FF0x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y11E(Test__ZN3ccc8FF0x2y11E, "_ZN3ccc8FF0x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y11C1Ev();
extern void _ZN3ccc8FF0x2y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y11E[] = {
  NSPAIR(_ZN3ccc8FF0x2y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x2y113efgEv();
extern void _ZN3ccc8FF0x2y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y11E[] = {
  {&(_ZTVN3ccc8FF0x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y11E[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y11E = {  "_ZN3ccc8FF0x2y11E", // class name
  bases__ZN3ccc8FF0x2y11E, 2,
  &(vtc__ZN3ccc8FF0x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names44,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y12  : virtual ::ccc::EE0x2 {
  virtual void  abc(); // _ZN3ccc8FF0x2y123abcEv
  ~FF0x2y12(); // tgen
  FF0x2y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x2y123abcEv");}
ccc::FF0x2y12 ::~FF0x2y12(){ note_dtor("_ZN3ccc8FF0x2y12E", this);} // tgen
ccc::FF0x2y12 ::FF0x2y12(){ note_ctor("_ZN3ccc8FF0x2y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y12E, buf);
    ::ccc::FF0x2y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y12E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y12E);
    dp->::ccc::FF0x2y12::~FF0x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y12E(Test__ZN3ccc8FF0x2y12E, "_ZN3ccc8FF0x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y12C1Ev();
extern void _ZN3ccc8FF0x2y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y12E[] = {
  NSPAIR(_ZN3ccc8FF0x2y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y12E[];
extern void _ZN3ccc8FF0x2y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y12E[] = {
  {&(_ZTVN3ccc8FF0x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y12E[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y12E = {  "_ZN3ccc8FF0x2y12E", // class name
  bases__ZN3ccc8FF0x2y12E, 2,
  &(vtc__ZN3ccc8FF0x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names45,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y13  : virtual ::ccc::EE0x2 {
  virtual void  efg(); // _ZN3ccc8FF0x2y133efgEv
  ~FF0x2y13(); // tgen
  FF0x2y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x2y133efgEv");}
ccc::FF0x2y13 ::~FF0x2y13(){ note_dtor("_ZN3ccc8FF0x2y13E", this);} // tgen
ccc::FF0x2y13 ::FF0x2y13(){ note_ctor("_ZN3ccc8FF0x2y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y13E, buf);
    ::ccc::FF0x2y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y13E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y13E);
    dp->::ccc::FF0x2y13::~FF0x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y13E(Test__ZN3ccc8FF0x2y13E, "_ZN3ccc8FF0x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y13C1Ev();
extern void _ZN3ccc8FF0x2y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y13E[] = {
  NSPAIR(_ZN3ccc8FF0x2y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x2y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y13E[] = {
  {&(_ZTVN3ccc8FF0x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y13E[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y13E = {  "_ZN3ccc8FF0x2y13E", // class name
  bases__ZN3ccc8FF0x2y13E, 2,
  &(vtc__ZN3ccc8FF0x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names46,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y14  : virtual ::ccc::EE0x2 {
  virtual void  pqr(); // _ZN3ccc8FF0x2y143pqrEv
  ~FF0x2y14(); // tgen
  FF0x2y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x2y143pqrEv");}
ccc::FF0x2y14 ::~FF0x2y14(){ note_dtor("_ZN3ccc8FF0x2y14E", this);} // tgen
ccc::FF0x2y14 ::FF0x2y14(){ note_ctor("_ZN3ccc8FF0x2y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y14E, buf);
    ::ccc::FF0x2y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y14E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y14E);
    dp->::ccc::FF0x2y14::~FF0x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y14E(Test__ZN3ccc8FF0x2y14E, "_ZN3ccc8FF0x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y14C1Ev();
extern void _ZN3ccc8FF0x2y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y14E[] = {
  NSPAIR(_ZN3ccc8FF0x2y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x2y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x2y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y14E[] = {
  {&(_ZTVN3ccc8FF0x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y14E[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y14E = {  "_ZN3ccc8FF0x2y14E", // class name
  bases__ZN3ccc8FF0x2y14E, 2,
  &(vtc__ZN3ccc8FF0x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names47,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x2y15  : virtual ::ccc::EE0x2 {
  ~FF0x2y15(); // tgen
  FF0x2y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x2y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x2y15 ::~FF0x2y15(){ note_dtor("_ZN3ccc8FF0x2y15E", this);} // tgen
ccc::FF0x2y15 ::FF0x2y15(){ note_ctor("_ZN3ccc8FF0x2y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x2y15E, buf);
    ::ccc::FF0x2y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x2y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y15E");
    check_base_class_offset(lv, (::ccc::EE0x2*), 0, "_ZN3ccc8FF0x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x2y15E);
    dp->::ccc::FF0x2y15::~FF0x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x2y15E(Test__ZN3ccc8FF0x2y15E, "_ZN3ccc8FF0x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x2y15C1Ev();
extern void _ZN3ccc8FF0x2y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x2y15E[] = {
  NSPAIR(_ZN3ccc8FF0x2y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x2E[];
static Base_Class bases__ZN3ccc8FF0x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x2y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv)();
extern void _ZN3ccc5EE0x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv)();
extern void _ZN3ccc5EE0x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv)();
extern void _ZN3ccc5EE0x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x2y15E[] = {
  {&(_ZTVN3ccc8FF0x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x2y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x2E__NS_8FF0x2y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x2y15E[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x23pqrEv,_ZTv0_n20_N3ccc5EE0x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x23efgEv,_ZTv0_n16_N3ccc5EE0x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x23abcEv,_ZTv0_n12_N3ccc5EE0x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x2y15E = {  "_ZN3ccc8FF0x2y15E", // class name
  bases__ZN3ccc8FF0x2y15E, 2,
  &(vtc__ZN3ccc8FF0x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x2y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x2y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x2y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x2y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names48,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y0  : virtual ::ccc::EE0x3 {
  virtual void  abc(); // _ZN3ccc7FF0x3y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y03pqrEv
  ~FF0x3y0(); // tgen
  FF0x3y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y03abcEv");}
void  ccc::FF0x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y03efgEv");}
void  ccc::FF0x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y03pqrEv");}
ccc::FF0x3y0 ::~FF0x3y0(){ note_dtor("_ZN3ccc7FF0x3y0E", this);} // tgen
ccc::FF0x3y0 ::FF0x3y0(){ note_ctor("_ZN3ccc7FF0x3y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y0E, buf);
    ::ccc::FF0x3y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y0E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y0E);
    dp->::ccc::FF0x3y0::~FF0x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y0E(Test__ZN3ccc7FF0x3y0E, "_ZN3ccc7FF0x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y0C1Ev();
extern void _ZN3ccc7FF0x3y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y0E[] = {
  NSPAIR(_ZN3ccc7FF0x3y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y0E[];
extern void _ZN3ccc7FF0x3y03abcEv();
extern void _ZN3ccc7FF0x3y03efgEv();
extern void _ZN3ccc7FF0x3y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y0E[] = {
  {&(_ZTVN3ccc7FF0x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y0E[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y0E = {  "_ZN3ccc7FF0x3y0E", // class name
  bases__ZN3ccc7FF0x3y0E, 2,
  &(vtc__ZN3ccc7FF0x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names49,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y1  : virtual ::ccc::EE0x3 {
  virtual void  abc(); // _ZN3ccc7FF0x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x3y13efgEv
  ~FF0x3y1(); // tgen
  FF0x3y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y13abcEv");}
void  ccc::FF0x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y13pqrEv");}
void  ccc::FF0x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y13efgEv");}
ccc::FF0x3y1 ::~FF0x3y1(){ note_dtor("_ZN3ccc7FF0x3y1E", this);} // tgen
ccc::FF0x3y1 ::FF0x3y1(){ note_ctor("_ZN3ccc7FF0x3y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y1E, buf);
    ::ccc::FF0x3y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y1E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y1E);
    dp->::ccc::FF0x3y1::~FF0x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y1E(Test__ZN3ccc7FF0x3y1E, "_ZN3ccc7FF0x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y1C1Ev();
extern void _ZN3ccc7FF0x3y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y1E[] = {
  NSPAIR(_ZN3ccc7FF0x3y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y1E[];
extern void _ZN3ccc7FF0x3y13abcEv();
extern void _ZN3ccc7FF0x3y13efgEv();
extern void _ZN3ccc7FF0x3y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y1E[] = {
  {&(_ZTVN3ccc7FF0x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y1E[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y1E = {  "_ZN3ccc7FF0x3y1E", // class name
  bases__ZN3ccc7FF0x3y1E, 2,
  &(vtc__ZN3ccc7FF0x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names50,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y2  : virtual ::ccc::EE0x3 {
  virtual void  efg(); // _ZN3ccc7FF0x3y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y23pqrEv
  ~FF0x3y2(); // tgen
  FF0x3y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y23efgEv");}
void  ccc::FF0x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y23abcEv");}
void  ccc::FF0x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y23pqrEv");}
ccc::FF0x3y2 ::~FF0x3y2(){ note_dtor("_ZN3ccc7FF0x3y2E", this);} // tgen
ccc::FF0x3y2 ::FF0x3y2(){ note_ctor("_ZN3ccc7FF0x3y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y2E, buf);
    ::ccc::FF0x3y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y2E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y2E);
    dp->::ccc::FF0x3y2::~FF0x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y2E(Test__ZN3ccc7FF0x3y2E, "_ZN3ccc7FF0x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y2C1Ev();
extern void _ZN3ccc7FF0x3y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y2E[] = {
  NSPAIR(_ZN3ccc7FF0x3y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y2E[];
extern void _ZN3ccc7FF0x3y23abcEv();
extern void _ZN3ccc7FF0x3y23efgEv();
extern void _ZN3ccc7FF0x3y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y2E[] = {
  {&(_ZTVN3ccc7FF0x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y2E[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y2E = {  "_ZN3ccc7FF0x3y2E", // class name
  bases__ZN3ccc7FF0x3y2E, 2,
  &(vtc__ZN3ccc7FF0x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names51,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y3  : virtual ::ccc::EE0x3 {
  virtual void  efg(); // _ZN3ccc7FF0x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x3y33abcEv
  ~FF0x3y3(); // tgen
  FF0x3y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y33efgEv");}
void  ccc::FF0x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y33pqrEv");}
void  ccc::FF0x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y33abcEv");}
ccc::FF0x3y3 ::~FF0x3y3(){ note_dtor("_ZN3ccc7FF0x3y3E", this);} // tgen
ccc::FF0x3y3 ::FF0x3y3(){ note_ctor("_ZN3ccc7FF0x3y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y3E, buf);
    ::ccc::FF0x3y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y3E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y3E);
    dp->::ccc::FF0x3y3::~FF0x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y3E(Test__ZN3ccc7FF0x3y3E, "_ZN3ccc7FF0x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y3C1Ev();
extern void _ZN3ccc7FF0x3y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y3E[] = {
  NSPAIR(_ZN3ccc7FF0x3y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y3E[];
extern void _ZN3ccc7FF0x3y33abcEv();
extern void _ZN3ccc7FF0x3y33efgEv();
extern void _ZN3ccc7FF0x3y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y3E[] = {
  {&(_ZTVN3ccc7FF0x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y3E[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y3E = {  "_ZN3ccc7FF0x3y3E", // class name
  bases__ZN3ccc7FF0x3y3E, 2,
  &(vtc__ZN3ccc7FF0x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names52,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y4  : virtual ::ccc::EE0x3 {
  virtual void  pqr(); // _ZN3ccc7FF0x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x3y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x3y43efgEv
  ~FF0x3y4(); // tgen
  FF0x3y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y43pqrEv");}
void  ccc::FF0x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y43abcEv");}
void  ccc::FF0x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y43efgEv");}
ccc::FF0x3y4 ::~FF0x3y4(){ note_dtor("_ZN3ccc7FF0x3y4E", this);} // tgen
ccc::FF0x3y4 ::FF0x3y4(){ note_ctor("_ZN3ccc7FF0x3y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y4E, buf);
    ::ccc::FF0x3y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y4E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y4E);
    dp->::ccc::FF0x3y4::~FF0x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y4E(Test__ZN3ccc7FF0x3y4E, "_ZN3ccc7FF0x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y4C1Ev();
extern void _ZN3ccc7FF0x3y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y4E[] = {
  NSPAIR(_ZN3ccc7FF0x3y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y4E[];
extern void _ZN3ccc7FF0x3y43abcEv();
extern void _ZN3ccc7FF0x3y43efgEv();
extern void _ZN3ccc7FF0x3y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y4E[] = {
  {&(_ZTVN3ccc7FF0x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y4E[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y4E = {  "_ZN3ccc7FF0x3y4E", // class name
  bases__ZN3ccc7FF0x3y4E, 2,
  &(vtc__ZN3ccc7FF0x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names53,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y5  : virtual ::ccc::EE0x3 {
  virtual void  pqr(); // _ZN3ccc7FF0x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x3y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x3y53abcEv
  ~FF0x3y5(); // tgen
  FF0x3y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y53pqrEv");}
void  ccc::FF0x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y53efgEv");}
void  ccc::FF0x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y53abcEv");}
ccc::FF0x3y5 ::~FF0x3y5(){ note_dtor("_ZN3ccc7FF0x3y5E", this);} // tgen
ccc::FF0x3y5 ::FF0x3y5(){ note_ctor("_ZN3ccc7FF0x3y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y5E, buf);
    ::ccc::FF0x3y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y5E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y5E);
    dp->::ccc::FF0x3y5::~FF0x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y5E(Test__ZN3ccc7FF0x3y5E, "_ZN3ccc7FF0x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y5C1Ev();
extern void _ZN3ccc7FF0x3y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y5E[] = {
  NSPAIR(_ZN3ccc7FF0x3y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y5E[];
extern void _ZN3ccc7FF0x3y53abcEv();
extern void _ZN3ccc7FF0x3y53efgEv();
extern void _ZN3ccc7FF0x3y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y5E[] = {
  {&(_ZTVN3ccc7FF0x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y5E[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y5E = {  "_ZN3ccc7FF0x3y5E", // class name
  bases__ZN3ccc7FF0x3y5E, 2,
  &(vtc__ZN3ccc7FF0x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names54,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y6  : virtual ::ccc::EE0x3 {
  virtual void  abc(); // _ZN3ccc7FF0x3y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x3y63efgEv
  ~FF0x3y6(); // tgen
  FF0x3y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y63abcEv");}
void  ccc::FF0x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y63efgEv");}
ccc::FF0x3y6 ::~FF0x3y6(){ note_dtor("_ZN3ccc7FF0x3y6E", this);} // tgen
ccc::FF0x3y6 ::FF0x3y6(){ note_ctor("_ZN3ccc7FF0x3y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y6E, buf);
    ::ccc::FF0x3y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y6E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y6E);
    dp->::ccc::FF0x3y6::~FF0x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y6E(Test__ZN3ccc7FF0x3y6E, "_ZN3ccc7FF0x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y6C1Ev();
extern void _ZN3ccc7FF0x3y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y6E[] = {
  NSPAIR(_ZN3ccc7FF0x3y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y6E[];
extern void _ZN3ccc7FF0x3y63abcEv();
extern void _ZN3ccc7FF0x3y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y6E[] = {
  {&(_ZTVN3ccc7FF0x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y6E[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y6E = {  "_ZN3ccc7FF0x3y6E", // class name
  bases__ZN3ccc7FF0x3y6E, 2,
  &(vtc__ZN3ccc7FF0x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names55,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y7  : virtual ::ccc::EE0x3 {
  virtual void  abc(); // _ZN3ccc7FF0x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y73pqrEv
  ~FF0x3y7(); // tgen
  FF0x3y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y73abcEv");}
void  ccc::FF0x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y73pqrEv");}
ccc::FF0x3y7 ::~FF0x3y7(){ note_dtor("_ZN3ccc7FF0x3y7E", this);} // tgen
ccc::FF0x3y7 ::FF0x3y7(){ note_ctor("_ZN3ccc7FF0x3y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y7E, buf);
    ::ccc::FF0x3y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y7E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y7E);
    dp->::ccc::FF0x3y7::~FF0x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y7E(Test__ZN3ccc7FF0x3y7E, "_ZN3ccc7FF0x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y7C1Ev();
extern void _ZN3ccc7FF0x3y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y7E[] = {
  NSPAIR(_ZN3ccc7FF0x3y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y7E[];
extern void _ZN3ccc7FF0x3y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x3y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y7E[] = {
  {&(_ZTVN3ccc7FF0x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y7E[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y7E = {  "_ZN3ccc7FF0x3y7E", // class name
  bases__ZN3ccc7FF0x3y7E, 2,
  &(vtc__ZN3ccc7FF0x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names56,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y8  : virtual ::ccc::EE0x3 {
  virtual void  efg(); // _ZN3ccc7FF0x3y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x3y83abcEv
  ~FF0x3y8(); // tgen
  FF0x3y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y83efgEv");}
void  ccc::FF0x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x3y83abcEv");}
ccc::FF0x3y8 ::~FF0x3y8(){ note_dtor("_ZN3ccc7FF0x3y8E", this);} // tgen
ccc::FF0x3y8 ::FF0x3y8(){ note_ctor("_ZN3ccc7FF0x3y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y8E, buf);
    ::ccc::FF0x3y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y8E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y8E);
    dp->::ccc::FF0x3y8::~FF0x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y8E(Test__ZN3ccc7FF0x3y8E, "_ZN3ccc7FF0x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y8C1Ev();
extern void _ZN3ccc7FF0x3y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y8E[] = {
  NSPAIR(_ZN3ccc7FF0x3y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y8E[];
extern void _ZN3ccc7FF0x3y83abcEv();
extern void _ZN3ccc7FF0x3y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y8E[] = {
  {&(_ZTVN3ccc7FF0x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y8E[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y8E = {  "_ZN3ccc7FF0x3y8E", // class name
  bases__ZN3ccc7FF0x3y8E, 2,
  &(vtc__ZN3ccc7FF0x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names57,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y9  : virtual ::ccc::EE0x3 {
  virtual void  efg(); // _ZN3ccc7FF0x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x3y93pqrEv
  ~FF0x3y9(); // tgen
  FF0x3y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x3y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x3y93efgEv");}
void  ccc::FF0x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x3y93pqrEv");}
ccc::FF0x3y9 ::~FF0x3y9(){ note_dtor("_ZN3ccc7FF0x3y9E", this);} // tgen
ccc::FF0x3y9 ::FF0x3y9(){ note_ctor("_ZN3ccc7FF0x3y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x3y9E, buf);
    ::ccc::FF0x3y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x3y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y9E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc7FF0x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x3y9E);
    dp->::ccc::FF0x3y9::~FF0x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x3y9E(Test__ZN3ccc7FF0x3y9E, "_ZN3ccc7FF0x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x3y9C1Ev();
extern void _ZN3ccc7FF0x3y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x3y9E[] = {
  NSPAIR(_ZN3ccc7FF0x3y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc7FF0x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x3y93efgEv();
extern void _ZN3ccc7FF0x3y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x3y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x3y9E[] = {
  {&(_ZTVN3ccc7FF0x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x3y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_7FF0x3y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x3y9E[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x3y9E = {  "_ZN3ccc7FF0x3y9E", // class name
  bases__ZN3ccc7FF0x3y9E, 2,
  &(vtc__ZN3ccc7FF0x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x3y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x3y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x3y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x3y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names58,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y10  : virtual ::ccc::EE0x3 {
  virtual void  pqr(); // _ZN3ccc8FF0x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x3y103abcEv
  ~FF0x3y10(); // tgen
  FF0x3y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x3y103pqrEv");}
void  ccc::FF0x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x3y103abcEv");}
ccc::FF0x3y10 ::~FF0x3y10(){ note_dtor("_ZN3ccc8FF0x3y10E", this);} // tgen
ccc::FF0x3y10 ::FF0x3y10(){ note_ctor("_ZN3ccc8FF0x3y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y10E, buf);
    ::ccc::FF0x3y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y10E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y10E);
    dp->::ccc::FF0x3y10::~FF0x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y10E(Test__ZN3ccc8FF0x3y10E, "_ZN3ccc8FF0x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y10C1Ev();
extern void _ZN3ccc8FF0x3y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y10E[] = {
  NSPAIR(_ZN3ccc8FF0x3y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y10E[];
extern void _ZN3ccc8FF0x3y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x3y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y10E[] = {
  {&(_ZTVN3ccc8FF0x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y10E[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y10E = {  "_ZN3ccc8FF0x3y10E", // class name
  bases__ZN3ccc8FF0x3y10E, 2,
  &(vtc__ZN3ccc8FF0x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names59,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y11  : virtual ::ccc::EE0x3 {
  virtual void  pqr(); // _ZN3ccc8FF0x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x3y113efgEv
  ~FF0x3y11(); // tgen
  FF0x3y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x3y113pqrEv");}
void  ccc::FF0x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x3y113efgEv");}
ccc::FF0x3y11 ::~FF0x3y11(){ note_dtor("_ZN3ccc8FF0x3y11E", this);} // tgen
ccc::FF0x3y11 ::FF0x3y11(){ note_ctor("_ZN3ccc8FF0x3y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y11E, buf);
    ::ccc::FF0x3y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y11E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y11E);
    dp->::ccc::FF0x3y11::~FF0x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y11E(Test__ZN3ccc8FF0x3y11E, "_ZN3ccc8FF0x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y11C1Ev();
extern void _ZN3ccc8FF0x3y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y11E[] = {
  NSPAIR(_ZN3ccc8FF0x3y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x3y113efgEv();
extern void _ZN3ccc8FF0x3y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y11E[] = {
  {&(_ZTVN3ccc8FF0x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y11E[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y11E = {  "_ZN3ccc8FF0x3y11E", // class name
  bases__ZN3ccc8FF0x3y11E, 2,
  &(vtc__ZN3ccc8FF0x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names60,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y12  : virtual ::ccc::EE0x3 {
  virtual void  abc(); // _ZN3ccc8FF0x3y123abcEv
  ~FF0x3y12(); // tgen
  FF0x3y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x3y123abcEv");}
ccc::FF0x3y12 ::~FF0x3y12(){ note_dtor("_ZN3ccc8FF0x3y12E", this);} // tgen
ccc::FF0x3y12 ::FF0x3y12(){ note_ctor("_ZN3ccc8FF0x3y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y12E, buf);
    ::ccc::FF0x3y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y12E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y12E);
    dp->::ccc::FF0x3y12::~FF0x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y12E(Test__ZN3ccc8FF0x3y12E, "_ZN3ccc8FF0x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y12C1Ev();
extern void _ZN3ccc8FF0x3y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y12E[] = {
  NSPAIR(_ZN3ccc8FF0x3y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y12E[];
extern void _ZN3ccc8FF0x3y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y12E[] = {
  {&(_ZTVN3ccc8FF0x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y12E[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y12E = {  "_ZN3ccc8FF0x3y12E", // class name
  bases__ZN3ccc8FF0x3y12E, 2,
  &(vtc__ZN3ccc8FF0x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names61,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y13  : virtual ::ccc::EE0x3 {
  virtual void  efg(); // _ZN3ccc8FF0x3y133efgEv
  ~FF0x3y13(); // tgen
  FF0x3y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x3y133efgEv");}
ccc::FF0x3y13 ::~FF0x3y13(){ note_dtor("_ZN3ccc8FF0x3y13E", this);} // tgen
ccc::FF0x3y13 ::FF0x3y13(){ note_ctor("_ZN3ccc8FF0x3y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y13E, buf);
    ::ccc::FF0x3y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y13E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y13E);
    dp->::ccc::FF0x3y13::~FF0x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y13E(Test__ZN3ccc8FF0x3y13E, "_ZN3ccc8FF0x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y13C1Ev();
extern void _ZN3ccc8FF0x3y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y13E[] = {
  NSPAIR(_ZN3ccc8FF0x3y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x3y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y13E[] = {
  {&(_ZTVN3ccc8FF0x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y13E[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y13E = {  "_ZN3ccc8FF0x3y13E", // class name
  bases__ZN3ccc8FF0x3y13E, 2,
  &(vtc__ZN3ccc8FF0x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names62,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y14  : virtual ::ccc::EE0x3 {
  virtual void  pqr(); // _ZN3ccc8FF0x3y143pqrEv
  ~FF0x3y14(); // tgen
  FF0x3y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x3y143pqrEv");}
ccc::FF0x3y14 ::~FF0x3y14(){ note_dtor("_ZN3ccc8FF0x3y14E", this);} // tgen
ccc::FF0x3y14 ::FF0x3y14(){ note_ctor("_ZN3ccc8FF0x3y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y14E, buf);
    ::ccc::FF0x3y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y14E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y14E);
    dp->::ccc::FF0x3y14::~FF0x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y14E(Test__ZN3ccc8FF0x3y14E, "_ZN3ccc8FF0x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y14C1Ev();
extern void _ZN3ccc8FF0x3y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y14E[] = {
  NSPAIR(_ZN3ccc8FF0x3y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x3y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x3y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y14E[] = {
  {&(_ZTVN3ccc8FF0x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y14E[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y14E = {  "_ZN3ccc8FF0x3y14E", // class name
  bases__ZN3ccc8FF0x3y14E, 2,
  &(vtc__ZN3ccc8FF0x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names63,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x3y15  : virtual ::ccc::EE0x3 {
  ~FF0x3y15(); // tgen
  FF0x3y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x3y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x3y15 ::~FF0x3y15(){ note_dtor("_ZN3ccc8FF0x3y15E", this);} // tgen
ccc::FF0x3y15 ::FF0x3y15(){ note_ctor("_ZN3ccc8FF0x3y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x3y15E, buf);
    ::ccc::FF0x3y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x3y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y15E");
    check_base_class_offset(lv, (::ccc::EE0x3*), 0, "_ZN3ccc8FF0x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x3y15E);
    dp->::ccc::FF0x3y15::~FF0x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x3y15E(Test__ZN3ccc8FF0x3y15E, "_ZN3ccc8FF0x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x3y15C1Ev();
extern void _ZN3ccc8FF0x3y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x3y15E[] = {
  NSPAIR(_ZN3ccc8FF0x3y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x3E[];
static Base_Class bases__ZN3ccc8FF0x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x3y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv)();
extern void _ZN3ccc5EE0x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv)();
extern void _ZN3ccc5EE0x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv)();
extern void _ZN3ccc5EE0x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x3y15E[] = {
  {&(_ZTVN3ccc8FF0x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x3y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x3E__NS_8FF0x3y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x3y15E[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x33pqrEv,_ZTv0_n20_N3ccc5EE0x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x33efgEv,_ZTv0_n16_N3ccc5EE0x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x33abcEv,_ZTv0_n12_N3ccc5EE0x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x3y15E = {  "_ZN3ccc8FF0x3y15E", // class name
  bases__ZN3ccc8FF0x3y15E, 2,
  &(vtc__ZN3ccc8FF0x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x3y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x3y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x3y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x3y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names64,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y0  : virtual ::ccc::EE0x4 {
  virtual void  abc(); // _ZN3ccc7FF0x4y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y03pqrEv
  ~FF0x4y0(); // tgen
  FF0x4y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y03abcEv");}
void  ccc::FF0x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y03efgEv");}
void  ccc::FF0x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y03pqrEv");}
ccc::FF0x4y0 ::~FF0x4y0(){ note_dtor("_ZN3ccc7FF0x4y0E", this);} // tgen
ccc::FF0x4y0 ::FF0x4y0(){ note_ctor("_ZN3ccc7FF0x4y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y0E, buf);
    ::ccc::FF0x4y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y0E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y0E);
    dp->::ccc::FF0x4y0::~FF0x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y0E(Test__ZN3ccc7FF0x4y0E, "_ZN3ccc7FF0x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y0C1Ev();
extern void _ZN3ccc7FF0x4y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y0E[] = {
  NSPAIR(_ZN3ccc7FF0x4y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y0E[];
extern void _ZN3ccc7FF0x4y03abcEv();
extern void _ZN3ccc7FF0x4y03efgEv();
extern void _ZN3ccc7FF0x4y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y0E[] = {
  {&(_ZTVN3ccc7FF0x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y0E[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y0E = {  "_ZN3ccc7FF0x4y0E", // class name
  bases__ZN3ccc7FF0x4y0E, 2,
  &(vtc__ZN3ccc7FF0x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names65,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y1  : virtual ::ccc::EE0x4 {
  virtual void  abc(); // _ZN3ccc7FF0x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x4y13efgEv
  ~FF0x4y1(); // tgen
  FF0x4y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y13abcEv");}
void  ccc::FF0x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y13pqrEv");}
void  ccc::FF0x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y13efgEv");}
ccc::FF0x4y1 ::~FF0x4y1(){ note_dtor("_ZN3ccc7FF0x4y1E", this);} // tgen
ccc::FF0x4y1 ::FF0x4y1(){ note_ctor("_ZN3ccc7FF0x4y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y1E, buf);
    ::ccc::FF0x4y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y1E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y1E);
    dp->::ccc::FF0x4y1::~FF0x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y1E(Test__ZN3ccc7FF0x4y1E, "_ZN3ccc7FF0x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y1C1Ev();
extern void _ZN3ccc7FF0x4y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y1E[] = {
  NSPAIR(_ZN3ccc7FF0x4y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y1E[];
extern void _ZN3ccc7FF0x4y13abcEv();
extern void _ZN3ccc7FF0x4y13efgEv();
extern void _ZN3ccc7FF0x4y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y1E[] = {
  {&(_ZTVN3ccc7FF0x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y1E[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y1E = {  "_ZN3ccc7FF0x4y1E", // class name
  bases__ZN3ccc7FF0x4y1E, 2,
  &(vtc__ZN3ccc7FF0x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names66,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y2  : virtual ::ccc::EE0x4 {
  virtual void  efg(); // _ZN3ccc7FF0x4y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y23pqrEv
  ~FF0x4y2(); // tgen
  FF0x4y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y23efgEv");}
void  ccc::FF0x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y23abcEv");}
void  ccc::FF0x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y23pqrEv");}
ccc::FF0x4y2 ::~FF0x4y2(){ note_dtor("_ZN3ccc7FF0x4y2E", this);} // tgen
ccc::FF0x4y2 ::FF0x4y2(){ note_ctor("_ZN3ccc7FF0x4y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y2E, buf);
    ::ccc::FF0x4y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y2E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y2E);
    dp->::ccc::FF0x4y2::~FF0x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y2E(Test__ZN3ccc7FF0x4y2E, "_ZN3ccc7FF0x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y2C1Ev();
extern void _ZN3ccc7FF0x4y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y2E[] = {
  NSPAIR(_ZN3ccc7FF0x4y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y2E[];
extern void _ZN3ccc7FF0x4y23abcEv();
extern void _ZN3ccc7FF0x4y23efgEv();
extern void _ZN3ccc7FF0x4y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y2E[] = {
  {&(_ZTVN3ccc7FF0x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y2E[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y2E = {  "_ZN3ccc7FF0x4y2E", // class name
  bases__ZN3ccc7FF0x4y2E, 2,
  &(vtc__ZN3ccc7FF0x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y2E),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
namespace ccc { 
struct  FF0x4y3  : virtual ::ccc::EE0x4 {
  virtual void  efg(); // _ZN3ccc7FF0x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x4y33abcEv
  ~FF0x4y3(); // tgen
  FF0x4y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y33efgEv");}
void  ccc::FF0x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y33pqrEv");}
void  ccc::FF0x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y33abcEv");}
ccc::FF0x4y3 ::~FF0x4y3(){ note_dtor("_ZN3ccc7FF0x4y3E", this);} // tgen
ccc::FF0x4y3 ::FF0x4y3(){ note_ctor("_ZN3ccc7FF0x4y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y3E, buf);
    ::ccc::FF0x4y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y3E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y3E);
    dp->::ccc::FF0x4y3::~FF0x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y3E(Test__ZN3ccc7FF0x4y3E, "_ZN3ccc7FF0x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y3C1Ev();
extern void _ZN3ccc7FF0x4y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y3E[] = {
  NSPAIR(_ZN3ccc7FF0x4y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y3E[];
extern void _ZN3ccc7FF0x4y33abcEv();
extern void _ZN3ccc7FF0x4y33efgEv();
extern void _ZN3ccc7FF0x4y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y3E[] = {
  {&(_ZTVN3ccc7FF0x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y3E[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y3E = {  "_ZN3ccc7FF0x4y3E", // class name
  bases__ZN3ccc7FF0x4y3E, 2,
  &(vtc__ZN3ccc7FF0x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names68,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y4  : virtual ::ccc::EE0x4 {
  virtual void  pqr(); // _ZN3ccc7FF0x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x4y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x4y43efgEv
  ~FF0x4y4(); // tgen
  FF0x4y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y43pqrEv");}
void  ccc::FF0x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y43abcEv");}
void  ccc::FF0x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y43efgEv");}
ccc::FF0x4y4 ::~FF0x4y4(){ note_dtor("_ZN3ccc7FF0x4y4E", this);} // tgen
ccc::FF0x4y4 ::FF0x4y4(){ note_ctor("_ZN3ccc7FF0x4y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y4E, buf);
    ::ccc::FF0x4y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y4E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y4E);
    dp->::ccc::FF0x4y4::~FF0x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y4E(Test__ZN3ccc7FF0x4y4E, "_ZN3ccc7FF0x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y4C1Ev();
extern void _ZN3ccc7FF0x4y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y4E[] = {
  NSPAIR(_ZN3ccc7FF0x4y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y4E[];
extern void _ZN3ccc7FF0x4y43abcEv();
extern void _ZN3ccc7FF0x4y43efgEv();
extern void _ZN3ccc7FF0x4y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y4E[] = {
  {&(_ZTVN3ccc7FF0x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y4E[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y4E = {  "_ZN3ccc7FF0x4y4E", // class name
  bases__ZN3ccc7FF0x4y4E, 2,
  &(vtc__ZN3ccc7FF0x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names69,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y5  : virtual ::ccc::EE0x4 {
  virtual void  pqr(); // _ZN3ccc7FF0x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x4y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x4y53abcEv
  ~FF0x4y5(); // tgen
  FF0x4y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y53pqrEv");}
void  ccc::FF0x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y53efgEv");}
void  ccc::FF0x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y53abcEv");}
ccc::FF0x4y5 ::~FF0x4y5(){ note_dtor("_ZN3ccc7FF0x4y5E", this);} // tgen
ccc::FF0x4y5 ::FF0x4y5(){ note_ctor("_ZN3ccc7FF0x4y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y5E, buf);
    ::ccc::FF0x4y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y5E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y5E);
    dp->::ccc::FF0x4y5::~FF0x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y5E(Test__ZN3ccc7FF0x4y5E, "_ZN3ccc7FF0x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y5C1Ev();
extern void _ZN3ccc7FF0x4y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y5E[] = {
  NSPAIR(_ZN3ccc7FF0x4y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y5E[];
extern void _ZN3ccc7FF0x4y53abcEv();
extern void _ZN3ccc7FF0x4y53efgEv();
extern void _ZN3ccc7FF0x4y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y5E[] = {
  {&(_ZTVN3ccc7FF0x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y5E[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y5E = {  "_ZN3ccc7FF0x4y5E", // class name
  bases__ZN3ccc7FF0x4y5E, 2,
  &(vtc__ZN3ccc7FF0x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names70,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y6  : virtual ::ccc::EE0x4 {
  virtual void  abc(); // _ZN3ccc7FF0x4y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x4y63efgEv
  ~FF0x4y6(); // tgen
  FF0x4y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y63abcEv");}
void  ccc::FF0x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y63efgEv");}
ccc::FF0x4y6 ::~FF0x4y6(){ note_dtor("_ZN3ccc7FF0x4y6E", this);} // tgen
ccc::FF0x4y6 ::FF0x4y6(){ note_ctor("_ZN3ccc7FF0x4y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y6E, buf);
    ::ccc::FF0x4y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y6E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y6E);
    dp->::ccc::FF0x4y6::~FF0x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y6E(Test__ZN3ccc7FF0x4y6E, "_ZN3ccc7FF0x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y6C1Ev();
extern void _ZN3ccc7FF0x4y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y6E[] = {
  NSPAIR(_ZN3ccc7FF0x4y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y6E[];
extern void _ZN3ccc7FF0x4y63abcEv();
extern void _ZN3ccc7FF0x4y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y6E[] = {
  {&(_ZTVN3ccc7FF0x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y6E[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y6E = {  "_ZN3ccc7FF0x4y6E", // class name
  bases__ZN3ccc7FF0x4y6E, 2,
  &(vtc__ZN3ccc7FF0x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names71,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y7  : virtual ::ccc::EE0x4 {
  virtual void  abc(); // _ZN3ccc7FF0x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y73pqrEv
  ~FF0x4y7(); // tgen
  FF0x4y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y73abcEv");}
void  ccc::FF0x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y73pqrEv");}
ccc::FF0x4y7 ::~FF0x4y7(){ note_dtor("_ZN3ccc7FF0x4y7E", this);} // tgen
ccc::FF0x4y7 ::FF0x4y7(){ note_ctor("_ZN3ccc7FF0x4y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y7E, buf);
    ::ccc::FF0x4y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y7E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y7E);
    dp->::ccc::FF0x4y7::~FF0x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y7E(Test__ZN3ccc7FF0x4y7E, "_ZN3ccc7FF0x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y7C1Ev();
extern void _ZN3ccc7FF0x4y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y7E[] = {
  NSPAIR(_ZN3ccc7FF0x4y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y7E[];
extern void _ZN3ccc7FF0x4y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x4y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y7E[] = {
  {&(_ZTVN3ccc7FF0x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y7E[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y7E = {  "_ZN3ccc7FF0x4y7E", // class name
  bases__ZN3ccc7FF0x4y7E, 2,
  &(vtc__ZN3ccc7FF0x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names72,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y8  : virtual ::ccc::EE0x4 {
  virtual void  efg(); // _ZN3ccc7FF0x4y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x4y83abcEv
  ~FF0x4y8(); // tgen
  FF0x4y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y83efgEv");}
void  ccc::FF0x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x4y83abcEv");}
ccc::FF0x4y8 ::~FF0x4y8(){ note_dtor("_ZN3ccc7FF0x4y8E", this);} // tgen
ccc::FF0x4y8 ::FF0x4y8(){ note_ctor("_ZN3ccc7FF0x4y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y8E, buf);
    ::ccc::FF0x4y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y8E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y8E);
    dp->::ccc::FF0x4y8::~FF0x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y8E(Test__ZN3ccc7FF0x4y8E, "_ZN3ccc7FF0x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y8C1Ev();
extern void _ZN3ccc7FF0x4y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y8E[] = {
  NSPAIR(_ZN3ccc7FF0x4y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y8E[];
extern void _ZN3ccc7FF0x4y83abcEv();
extern void _ZN3ccc7FF0x4y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y8E[] = {
  {&(_ZTVN3ccc7FF0x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y8E[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y8E = {  "_ZN3ccc7FF0x4y8E", // class name
  bases__ZN3ccc7FF0x4y8E, 2,
  &(vtc__ZN3ccc7FF0x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names73,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y9  : virtual ::ccc::EE0x4 {
  virtual void  efg(); // _ZN3ccc7FF0x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x4y93pqrEv
  ~FF0x4y9(); // tgen
  FF0x4y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x4y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x4y93efgEv");}
void  ccc::FF0x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x4y93pqrEv");}
ccc::FF0x4y9 ::~FF0x4y9(){ note_dtor("_ZN3ccc7FF0x4y9E", this);} // tgen
ccc::FF0x4y9 ::FF0x4y9(){ note_ctor("_ZN3ccc7FF0x4y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x4y9E, buf);
    ::ccc::FF0x4y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x4y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y9E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc7FF0x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x4y9E);
    dp->::ccc::FF0x4y9::~FF0x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x4y9E(Test__ZN3ccc7FF0x4y9E, "_ZN3ccc7FF0x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x4y9C1Ev();
extern void _ZN3ccc7FF0x4y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x4y9E[] = {
  NSPAIR(_ZN3ccc7FF0x4y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc7FF0x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x4y93efgEv();
extern void _ZN3ccc7FF0x4y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x4y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x4y9E[] = {
  {&(_ZTVN3ccc7FF0x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x4y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_7FF0x4y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x4y9E[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x4y9E = {  "_ZN3ccc7FF0x4y9E", // class name
  bases__ZN3ccc7FF0x4y9E, 2,
  &(vtc__ZN3ccc7FF0x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x4y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x4y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x4y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x4y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names74,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y10  : virtual ::ccc::EE0x4 {
  virtual void  pqr(); // _ZN3ccc8FF0x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x4y103abcEv
  ~FF0x4y10(); // tgen
  FF0x4y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x4y103pqrEv");}
void  ccc::FF0x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x4y103abcEv");}
ccc::FF0x4y10 ::~FF0x4y10(){ note_dtor("_ZN3ccc8FF0x4y10E", this);} // tgen
ccc::FF0x4y10 ::FF0x4y10(){ note_ctor("_ZN3ccc8FF0x4y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y10E, buf);
    ::ccc::FF0x4y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y10E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y10E);
    dp->::ccc::FF0x4y10::~FF0x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y10E(Test__ZN3ccc8FF0x4y10E, "_ZN3ccc8FF0x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y10C1Ev();
extern void _ZN3ccc8FF0x4y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y10E[] = {
  NSPAIR(_ZN3ccc8FF0x4y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y10E[];
extern void _ZN3ccc8FF0x4y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x4y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y10E[] = {
  {&(_ZTVN3ccc8FF0x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y10E[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y10E = {  "_ZN3ccc8FF0x4y10E", // class name
  bases__ZN3ccc8FF0x4y10E, 2,
  &(vtc__ZN3ccc8FF0x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names75,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y11  : virtual ::ccc::EE0x4 {
  virtual void  pqr(); // _ZN3ccc8FF0x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x4y113efgEv
  ~FF0x4y11(); // tgen
  FF0x4y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x4y113pqrEv");}
void  ccc::FF0x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x4y113efgEv");}
ccc::FF0x4y11 ::~FF0x4y11(){ note_dtor("_ZN3ccc8FF0x4y11E", this);} // tgen
ccc::FF0x4y11 ::FF0x4y11(){ note_ctor("_ZN3ccc8FF0x4y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y11E, buf);
    ::ccc::FF0x4y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y11E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y11E);
    dp->::ccc::FF0x4y11::~FF0x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y11E(Test__ZN3ccc8FF0x4y11E, "_ZN3ccc8FF0x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y11C1Ev();
extern void _ZN3ccc8FF0x4y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y11E[] = {
  NSPAIR(_ZN3ccc8FF0x4y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x4y113efgEv();
extern void _ZN3ccc8FF0x4y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y11E[] = {
  {&(_ZTVN3ccc8FF0x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y11E[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y11E = {  "_ZN3ccc8FF0x4y11E", // class name
  bases__ZN3ccc8FF0x4y11E, 2,
  &(vtc__ZN3ccc8FF0x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names76,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y12  : virtual ::ccc::EE0x4 {
  virtual void  abc(); // _ZN3ccc8FF0x4y123abcEv
  ~FF0x4y12(); // tgen
  FF0x4y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x4y123abcEv");}
ccc::FF0x4y12 ::~FF0x4y12(){ note_dtor("_ZN3ccc8FF0x4y12E", this);} // tgen
ccc::FF0x4y12 ::FF0x4y12(){ note_ctor("_ZN3ccc8FF0x4y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y12E, buf);
    ::ccc::FF0x4y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y12E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y12E);
    dp->::ccc::FF0x4y12::~FF0x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y12E(Test__ZN3ccc8FF0x4y12E, "_ZN3ccc8FF0x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y12C1Ev();
extern void _ZN3ccc8FF0x4y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y12E[] = {
  NSPAIR(_ZN3ccc8FF0x4y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y12E[];
extern void _ZN3ccc8FF0x4y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y12E[] = {
  {&(_ZTVN3ccc8FF0x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y12E[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y12E = {  "_ZN3ccc8FF0x4y12E", // class name
  bases__ZN3ccc8FF0x4y12E, 2,
  &(vtc__ZN3ccc8FF0x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names77,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y13  : virtual ::ccc::EE0x4 {
  virtual void  efg(); // _ZN3ccc8FF0x4y133efgEv
  ~FF0x4y13(); // tgen
  FF0x4y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x4y133efgEv");}
ccc::FF0x4y13 ::~FF0x4y13(){ note_dtor("_ZN3ccc8FF0x4y13E", this);} // tgen
ccc::FF0x4y13 ::FF0x4y13(){ note_ctor("_ZN3ccc8FF0x4y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y13E, buf);
    ::ccc::FF0x4y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y13E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y13E);
    dp->::ccc::FF0x4y13::~FF0x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y13E(Test__ZN3ccc8FF0x4y13E, "_ZN3ccc8FF0x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y13C1Ev();
extern void _ZN3ccc8FF0x4y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y13E[] = {
  NSPAIR(_ZN3ccc8FF0x4y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x4y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y13E[] = {
  {&(_ZTVN3ccc8FF0x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y13E[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y13E = {  "_ZN3ccc8FF0x4y13E", // class name
  bases__ZN3ccc8FF0x4y13E, 2,
  &(vtc__ZN3ccc8FF0x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names78,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y14  : virtual ::ccc::EE0x4 {
  virtual void  pqr(); // _ZN3ccc8FF0x4y143pqrEv
  ~FF0x4y14(); // tgen
  FF0x4y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x4y143pqrEv");}
ccc::FF0x4y14 ::~FF0x4y14(){ note_dtor("_ZN3ccc8FF0x4y14E", this);} // tgen
ccc::FF0x4y14 ::FF0x4y14(){ note_ctor("_ZN3ccc8FF0x4y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y14E, buf);
    ::ccc::FF0x4y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y14E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y14E);
    dp->::ccc::FF0x4y14::~FF0x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y14E(Test__ZN3ccc8FF0x4y14E, "_ZN3ccc8FF0x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y14C1Ev();
extern void _ZN3ccc8FF0x4y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y14E[] = {
  NSPAIR(_ZN3ccc8FF0x4y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x4y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x4y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y14E[] = {
  {&(_ZTVN3ccc8FF0x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y14E[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y14E = {  "_ZN3ccc8FF0x4y14E", // class name
  bases__ZN3ccc8FF0x4y14E, 2,
  &(vtc__ZN3ccc8FF0x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names79,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x4y15  : virtual ::ccc::EE0x4 {
  ~FF0x4y15(); // tgen
  FF0x4y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x4y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x4y15 ::~FF0x4y15(){ note_dtor("_ZN3ccc8FF0x4y15E", this);} // tgen
ccc::FF0x4y15 ::FF0x4y15(){ note_ctor("_ZN3ccc8FF0x4y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x4y15E, buf);
    ::ccc::FF0x4y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x4y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y15E");
    check_base_class_offset(lv, (::ccc::EE0x4*), 0, "_ZN3ccc8FF0x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x4y15E);
    dp->::ccc::FF0x4y15::~FF0x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x4y15E(Test__ZN3ccc8FF0x4y15E, "_ZN3ccc8FF0x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x4y15C1Ev();
extern void _ZN3ccc8FF0x4y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x4y15E[] = {
  NSPAIR(_ZN3ccc8FF0x4y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x4E[];
static Base_Class bases__ZN3ccc8FF0x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x4y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv)();
extern void _ZN3ccc5EE0x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv)();
extern void _ZN3ccc5EE0x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv)();
extern void _ZN3ccc5EE0x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x4y15E[] = {
  {&(_ZTVN3ccc8FF0x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x4y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x4E__NS_8FF0x4y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x4y15E[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x43pqrEv,_ZTv0_n20_N3ccc5EE0x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x43efgEv,_ZTv0_n16_N3ccc5EE0x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x43abcEv,_ZTv0_n12_N3ccc5EE0x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x4y15E = {  "_ZN3ccc8FF0x4y15E", // class name
  bases__ZN3ccc8FF0x4y15E, 2,
  &(vtc__ZN3ccc8FF0x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x4y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x4y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x4y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x4y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names80,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y0  : virtual ::ccc::EE0x5 {
  virtual void  abc(); // _ZN3ccc7FF0x5y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y03pqrEv
  ~FF0x5y0(); // tgen
  FF0x5y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y03abcEv");}
void  ccc::FF0x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y03efgEv");}
void  ccc::FF0x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y03pqrEv");}
ccc::FF0x5y0 ::~FF0x5y0(){ note_dtor("_ZN3ccc7FF0x5y0E", this);} // tgen
ccc::FF0x5y0 ::FF0x5y0(){ note_ctor("_ZN3ccc7FF0x5y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y0E, buf);
    ::ccc::FF0x5y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y0E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y0E);
    dp->::ccc::FF0x5y0::~FF0x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y0E(Test__ZN3ccc7FF0x5y0E, "_ZN3ccc7FF0x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y0C1Ev();
extern void _ZN3ccc7FF0x5y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y0E[] = {
  NSPAIR(_ZN3ccc7FF0x5y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y0E[];
extern void _ZN3ccc7FF0x5y03abcEv();
extern void _ZN3ccc7FF0x5y03efgEv();
extern void _ZN3ccc7FF0x5y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y0E[] = {
  {&(_ZTVN3ccc7FF0x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y0E[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y0E = {  "_ZN3ccc7FF0x5y0E", // class name
  bases__ZN3ccc7FF0x5y0E, 2,
  &(vtc__ZN3ccc7FF0x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names81,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y1  : virtual ::ccc::EE0x5 {
  virtual void  abc(); // _ZN3ccc7FF0x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x5y13efgEv
  ~FF0x5y1(); // tgen
  FF0x5y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y13abcEv");}
void  ccc::FF0x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y13pqrEv");}
void  ccc::FF0x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y13efgEv");}
ccc::FF0x5y1 ::~FF0x5y1(){ note_dtor("_ZN3ccc7FF0x5y1E", this);} // tgen
ccc::FF0x5y1 ::FF0x5y1(){ note_ctor("_ZN3ccc7FF0x5y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y1E, buf);
    ::ccc::FF0x5y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y1E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y1E);
    dp->::ccc::FF0x5y1::~FF0x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y1E(Test__ZN3ccc7FF0x5y1E, "_ZN3ccc7FF0x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y1C1Ev();
extern void _ZN3ccc7FF0x5y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y1E[] = {
  NSPAIR(_ZN3ccc7FF0x5y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y1E[];
extern void _ZN3ccc7FF0x5y13abcEv();
extern void _ZN3ccc7FF0x5y13efgEv();
extern void _ZN3ccc7FF0x5y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y1E[] = {
  {&(_ZTVN3ccc7FF0x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y1E[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y1E = {  "_ZN3ccc7FF0x5y1E", // class name
  bases__ZN3ccc7FF0x5y1E, 2,
  &(vtc__ZN3ccc7FF0x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names82,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y2  : virtual ::ccc::EE0x5 {
  virtual void  efg(); // _ZN3ccc7FF0x5y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y23pqrEv
  ~FF0x5y2(); // tgen
  FF0x5y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y23efgEv");}
void  ccc::FF0x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y23abcEv");}
void  ccc::FF0x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y23pqrEv");}
ccc::FF0x5y2 ::~FF0x5y2(){ note_dtor("_ZN3ccc7FF0x5y2E", this);} // tgen
ccc::FF0x5y2 ::FF0x5y2(){ note_ctor("_ZN3ccc7FF0x5y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y2E, buf);
    ::ccc::FF0x5y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y2E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y2E);
    dp->::ccc::FF0x5y2::~FF0x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y2E(Test__ZN3ccc7FF0x5y2E, "_ZN3ccc7FF0x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y2C1Ev();
extern void _ZN3ccc7FF0x5y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y2E[] = {
  NSPAIR(_ZN3ccc7FF0x5y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y2E[];
extern void _ZN3ccc7FF0x5y23abcEv();
extern void _ZN3ccc7FF0x5y23efgEv();
extern void _ZN3ccc7FF0x5y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y2E[] = {
  {&(_ZTVN3ccc7FF0x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y2E[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y2E = {  "_ZN3ccc7FF0x5y2E", // class name
  bases__ZN3ccc7FF0x5y2E, 2,
  &(vtc__ZN3ccc7FF0x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names83,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y3  : virtual ::ccc::EE0x5 {
  virtual void  efg(); // _ZN3ccc7FF0x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x5y33abcEv
  ~FF0x5y3(); // tgen
  FF0x5y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y33efgEv");}
void  ccc::FF0x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y33pqrEv");}
void  ccc::FF0x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y33abcEv");}
ccc::FF0x5y3 ::~FF0x5y3(){ note_dtor("_ZN3ccc7FF0x5y3E", this);} // tgen
ccc::FF0x5y3 ::FF0x5y3(){ note_ctor("_ZN3ccc7FF0x5y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y3E, buf);
    ::ccc::FF0x5y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y3E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y3E);
    dp->::ccc::FF0x5y3::~FF0x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y3E(Test__ZN3ccc7FF0x5y3E, "_ZN3ccc7FF0x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y3C1Ev();
extern void _ZN3ccc7FF0x5y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y3E[] = {
  NSPAIR(_ZN3ccc7FF0x5y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y3E[];
extern void _ZN3ccc7FF0x5y33abcEv();
extern void _ZN3ccc7FF0x5y33efgEv();
extern void _ZN3ccc7FF0x5y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y3E[] = {
  {&(_ZTVN3ccc7FF0x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y3E[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y3E = {  "_ZN3ccc7FF0x5y3E", // class name
  bases__ZN3ccc7FF0x5y3E, 2,
  &(vtc__ZN3ccc7FF0x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names84,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y4  : virtual ::ccc::EE0x5 {
  virtual void  pqr(); // _ZN3ccc7FF0x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x5y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x5y43efgEv
  ~FF0x5y4(); // tgen
  FF0x5y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y43pqrEv");}
void  ccc::FF0x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y43abcEv");}
void  ccc::FF0x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y43efgEv");}
ccc::FF0x5y4 ::~FF0x5y4(){ note_dtor("_ZN3ccc7FF0x5y4E", this);} // tgen
ccc::FF0x5y4 ::FF0x5y4(){ note_ctor("_ZN3ccc7FF0x5y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y4E, buf);
    ::ccc::FF0x5y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y4E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y4E);
    dp->::ccc::FF0x5y4::~FF0x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y4E(Test__ZN3ccc7FF0x5y4E, "_ZN3ccc7FF0x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y4C1Ev();
extern void _ZN3ccc7FF0x5y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y4E[] = {
  NSPAIR(_ZN3ccc7FF0x5y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y4E[];
extern void _ZN3ccc7FF0x5y43abcEv();
extern void _ZN3ccc7FF0x5y43efgEv();
extern void _ZN3ccc7FF0x5y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y4E[] = {
  {&(_ZTVN3ccc7FF0x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y4E[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y4E = {  "_ZN3ccc7FF0x5y4E", // class name
  bases__ZN3ccc7FF0x5y4E, 2,
  &(vtc__ZN3ccc7FF0x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y4E),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
namespace ccc { 
struct  FF0x5y5  : virtual ::ccc::EE0x5 {
  virtual void  pqr(); // _ZN3ccc7FF0x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x5y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x5y53abcEv
  ~FF0x5y5(); // tgen
  FF0x5y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y53pqrEv");}
void  ccc::FF0x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y53efgEv");}
void  ccc::FF0x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y53abcEv");}
ccc::FF0x5y5 ::~FF0x5y5(){ note_dtor("_ZN3ccc7FF0x5y5E", this);} // tgen
ccc::FF0x5y5 ::FF0x5y5(){ note_ctor("_ZN3ccc7FF0x5y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y5E, buf);
    ::ccc::FF0x5y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y5E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y5E);
    dp->::ccc::FF0x5y5::~FF0x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y5E(Test__ZN3ccc7FF0x5y5E, "_ZN3ccc7FF0x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y5C1Ev();
extern void _ZN3ccc7FF0x5y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y5E[] = {
  NSPAIR(_ZN3ccc7FF0x5y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y5E[];
extern void _ZN3ccc7FF0x5y53abcEv();
extern void _ZN3ccc7FF0x5y53efgEv();
extern void _ZN3ccc7FF0x5y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y5E[] = {
  {&(_ZTVN3ccc7FF0x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y5E[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y5E = {  "_ZN3ccc7FF0x5y5E", // class name
  bases__ZN3ccc7FF0x5y5E, 2,
  &(vtc__ZN3ccc7FF0x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names86,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y6  : virtual ::ccc::EE0x5 {
  virtual void  abc(); // _ZN3ccc7FF0x5y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x5y63efgEv
  ~FF0x5y6(); // tgen
  FF0x5y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y63abcEv");}
void  ccc::FF0x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y63efgEv");}
ccc::FF0x5y6 ::~FF0x5y6(){ note_dtor("_ZN3ccc7FF0x5y6E", this);} // tgen
ccc::FF0x5y6 ::FF0x5y6(){ note_ctor("_ZN3ccc7FF0x5y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y6E, buf);
    ::ccc::FF0x5y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y6E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y6E);
    dp->::ccc::FF0x5y6::~FF0x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y6E(Test__ZN3ccc7FF0x5y6E, "_ZN3ccc7FF0x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y6C1Ev();
extern void _ZN3ccc7FF0x5y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y6E[] = {
  NSPAIR(_ZN3ccc7FF0x5y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y6E[];
extern void _ZN3ccc7FF0x5y63abcEv();
extern void _ZN3ccc7FF0x5y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y6E[] = {
  {&(_ZTVN3ccc7FF0x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y6E[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y6E = {  "_ZN3ccc7FF0x5y6E", // class name
  bases__ZN3ccc7FF0x5y6E, 2,
  &(vtc__ZN3ccc7FF0x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names87,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y7  : virtual ::ccc::EE0x5 {
  virtual void  abc(); // _ZN3ccc7FF0x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y73pqrEv
  ~FF0x5y7(); // tgen
  FF0x5y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y73abcEv");}
void  ccc::FF0x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y73pqrEv");}
ccc::FF0x5y7 ::~FF0x5y7(){ note_dtor("_ZN3ccc7FF0x5y7E", this);} // tgen
ccc::FF0x5y7 ::FF0x5y7(){ note_ctor("_ZN3ccc7FF0x5y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y7E, buf);
    ::ccc::FF0x5y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y7E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y7E);
    dp->::ccc::FF0x5y7::~FF0x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y7E(Test__ZN3ccc7FF0x5y7E, "_ZN3ccc7FF0x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y7C1Ev();
extern void _ZN3ccc7FF0x5y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y7E[] = {
  NSPAIR(_ZN3ccc7FF0x5y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y7E[];
extern void _ZN3ccc7FF0x5y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x5y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y7E[] = {
  {&(_ZTVN3ccc7FF0x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y7E[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y7E = {  "_ZN3ccc7FF0x5y7E", // class name
  bases__ZN3ccc7FF0x5y7E, 2,
  &(vtc__ZN3ccc7FF0x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names88,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y8  : virtual ::ccc::EE0x5 {
  virtual void  efg(); // _ZN3ccc7FF0x5y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x5y83abcEv
  ~FF0x5y8(); // tgen
  FF0x5y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y83efgEv");}
void  ccc::FF0x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x5y83abcEv");}
ccc::FF0x5y8 ::~FF0x5y8(){ note_dtor("_ZN3ccc7FF0x5y8E", this);} // tgen
ccc::FF0x5y8 ::FF0x5y8(){ note_ctor("_ZN3ccc7FF0x5y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y8E, buf);
    ::ccc::FF0x5y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y8E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y8E);
    dp->::ccc::FF0x5y8::~FF0x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y8E(Test__ZN3ccc7FF0x5y8E, "_ZN3ccc7FF0x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y8C1Ev();
extern void _ZN3ccc7FF0x5y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y8E[] = {
  NSPAIR(_ZN3ccc7FF0x5y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y8E[];
extern void _ZN3ccc7FF0x5y83abcEv();
extern void _ZN3ccc7FF0x5y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y8E[] = {
  {&(_ZTVN3ccc7FF0x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y8E[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y8E = {  "_ZN3ccc7FF0x5y8E", // class name
  bases__ZN3ccc7FF0x5y8E, 2,
  &(vtc__ZN3ccc7FF0x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names89,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y9  : virtual ::ccc::EE0x5 {
  virtual void  efg(); // _ZN3ccc7FF0x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x5y93pqrEv
  ~FF0x5y9(); // tgen
  FF0x5y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x5y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x5y93efgEv");}
void  ccc::FF0x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x5y93pqrEv");}
ccc::FF0x5y9 ::~FF0x5y9(){ note_dtor("_ZN3ccc7FF0x5y9E", this);} // tgen
ccc::FF0x5y9 ::FF0x5y9(){ note_ctor("_ZN3ccc7FF0x5y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x5y9E, buf);
    ::ccc::FF0x5y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x5y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y9E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc7FF0x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x5y9E);
    dp->::ccc::FF0x5y9::~FF0x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x5y9E(Test__ZN3ccc7FF0x5y9E, "_ZN3ccc7FF0x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x5y9C1Ev();
extern void _ZN3ccc7FF0x5y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x5y9E[] = {
  NSPAIR(_ZN3ccc7FF0x5y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc7FF0x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x5y93efgEv();
extern void _ZN3ccc7FF0x5y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x5y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x5y9E[] = {
  {&(_ZTVN3ccc7FF0x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x5y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_7FF0x5y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x5y9E[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x5y9E = {  "_ZN3ccc7FF0x5y9E", // class name
  bases__ZN3ccc7FF0x5y9E, 2,
  &(vtc__ZN3ccc7FF0x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x5y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x5y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x5y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x5y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names90,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y10  : virtual ::ccc::EE0x5 {
  virtual void  pqr(); // _ZN3ccc8FF0x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x5y103abcEv
  ~FF0x5y10(); // tgen
  FF0x5y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x5y103pqrEv");}
void  ccc::FF0x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x5y103abcEv");}
ccc::FF0x5y10 ::~FF0x5y10(){ note_dtor("_ZN3ccc8FF0x5y10E", this);} // tgen
ccc::FF0x5y10 ::FF0x5y10(){ note_ctor("_ZN3ccc8FF0x5y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y10E, buf);
    ::ccc::FF0x5y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y10E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y10E);
    dp->::ccc::FF0x5y10::~FF0x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y10E(Test__ZN3ccc8FF0x5y10E, "_ZN3ccc8FF0x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y10C1Ev();
extern void _ZN3ccc8FF0x5y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y10E[] = {
  NSPAIR(_ZN3ccc8FF0x5y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y10E[];
extern void _ZN3ccc8FF0x5y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x5y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y10E[] = {
  {&(_ZTVN3ccc8FF0x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y10E[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y10E = {  "_ZN3ccc8FF0x5y10E", // class name
  bases__ZN3ccc8FF0x5y10E, 2,
  &(vtc__ZN3ccc8FF0x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names91,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y11  : virtual ::ccc::EE0x5 {
  virtual void  pqr(); // _ZN3ccc8FF0x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x5y113efgEv
  ~FF0x5y11(); // tgen
  FF0x5y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x5y113pqrEv");}
void  ccc::FF0x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x5y113efgEv");}
ccc::FF0x5y11 ::~FF0x5y11(){ note_dtor("_ZN3ccc8FF0x5y11E", this);} // tgen
ccc::FF0x5y11 ::FF0x5y11(){ note_ctor("_ZN3ccc8FF0x5y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y11E, buf);
    ::ccc::FF0x5y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y11E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y11E);
    dp->::ccc::FF0x5y11::~FF0x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y11E(Test__ZN3ccc8FF0x5y11E, "_ZN3ccc8FF0x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y11C1Ev();
extern void _ZN3ccc8FF0x5y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y11E[] = {
  NSPAIR(_ZN3ccc8FF0x5y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x5y113efgEv();
extern void _ZN3ccc8FF0x5y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y11E[] = {
  {&(_ZTVN3ccc8FF0x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y11E[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y11E = {  "_ZN3ccc8FF0x5y11E", // class name
  bases__ZN3ccc8FF0x5y11E, 2,
  &(vtc__ZN3ccc8FF0x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names92,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y12  : virtual ::ccc::EE0x5 {
  virtual void  abc(); // _ZN3ccc8FF0x5y123abcEv
  ~FF0x5y12(); // tgen
  FF0x5y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF0x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x5y123abcEv");}
ccc::FF0x5y12 ::~FF0x5y12(){ note_dtor("_ZN3ccc8FF0x5y12E", this);} // tgen
ccc::FF0x5y12 ::FF0x5y12(){ note_ctor("_ZN3ccc8FF0x5y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y12E, buf);
    ::ccc::FF0x5y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y12E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y12E);
    dp->::ccc::FF0x5y12::~FF0x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y12E(Test__ZN3ccc8FF0x5y12E, "_ZN3ccc8FF0x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y12C1Ev();
extern void _ZN3ccc8FF0x5y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y12E[] = {
  NSPAIR(_ZN3ccc8FF0x5y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y12E[];
extern void _ZN3ccc8FF0x5y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y12E[] = {
  {&(_ZTVN3ccc8FF0x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y12E[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y12E = {  "_ZN3ccc8FF0x5y12E", // class name
  bases__ZN3ccc8FF0x5y12E, 2,
  &(vtc__ZN3ccc8FF0x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names93,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y13  : virtual ::ccc::EE0x5 {
  virtual void  efg(); // _ZN3ccc8FF0x5y133efgEv
  ~FF0x5y13(); // tgen
  FF0x5y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF0x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x5y133efgEv");}
ccc::FF0x5y13 ::~FF0x5y13(){ note_dtor("_ZN3ccc8FF0x5y13E", this);} // tgen
ccc::FF0x5y13 ::FF0x5y13(){ note_ctor("_ZN3ccc8FF0x5y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y13E, buf);
    ::ccc::FF0x5y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y13E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y13E);
    dp->::ccc::FF0x5y13::~FF0x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y13E(Test__ZN3ccc8FF0x5y13E, "_ZN3ccc8FF0x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y13C1Ev();
extern void _ZN3ccc8FF0x5y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y13E[] = {
  NSPAIR(_ZN3ccc8FF0x5y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x5y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y13E[] = {
  {&(_ZTVN3ccc8FF0x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y13E[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y13E = {  "_ZN3ccc8FF0x5y13E", // class name
  bases__ZN3ccc8FF0x5y13E, 2,
  &(vtc__ZN3ccc8FF0x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names94,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y14  : virtual ::ccc::EE0x5 {
  virtual void  pqr(); // _ZN3ccc8FF0x5y143pqrEv
  ~FF0x5y14(); // tgen
  FF0x5y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x5y143pqrEv");}
ccc::FF0x5y14 ::~FF0x5y14(){ note_dtor("_ZN3ccc8FF0x5y14E", this);} // tgen
ccc::FF0x5y14 ::FF0x5y14(){ note_ctor("_ZN3ccc8FF0x5y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y14E, buf);
    ::ccc::FF0x5y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y14E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y14E);
    dp->::ccc::FF0x5y14::~FF0x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y14E(Test__ZN3ccc8FF0x5y14E, "_ZN3ccc8FF0x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y14C1Ev();
extern void _ZN3ccc8FF0x5y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y14E[] = {
  NSPAIR(_ZN3ccc8FF0x5y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x5y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x5y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y14E[] = {
  {&(_ZTVN3ccc8FF0x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y14E[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y14E = {  "_ZN3ccc8FF0x5y14E", // class name
  bases__ZN3ccc8FF0x5y14E, 2,
  &(vtc__ZN3ccc8FF0x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names95,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x5y15  : virtual ::ccc::EE0x5 {
  ~FF0x5y15(); // tgen
  FF0x5y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x5y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF0x5y15 ::~FF0x5y15(){ note_dtor("_ZN3ccc8FF0x5y15E", this);} // tgen
ccc::FF0x5y15 ::FF0x5y15(){ note_ctor("_ZN3ccc8FF0x5y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x5y15E, buf);
    ::ccc::FF0x5y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x5y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y15E");
    check_base_class_offset(lv, (::ccc::EE0x5*), 0, "_ZN3ccc8FF0x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x5y15E);
    dp->::ccc::FF0x5y15::~FF0x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x5y15E(Test__ZN3ccc8FF0x5y15E, "_ZN3ccc8FF0x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x5y15C1Ev();
extern void _ZN3ccc8FF0x5y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x5y15E[] = {
  NSPAIR(_ZN3ccc8FF0x5y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x5E[];
static Base_Class bases__ZN3ccc8FF0x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x5y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv)();
extern void _ZN3ccc5EE0x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv)();
extern void _ZN3ccc5EE0x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv)();
extern void _ZN3ccc5EE0x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x5y15E[] = {
  {&(_ZTVN3ccc8FF0x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x5y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x5E__NS_8FF0x5y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x5y15E[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x53pqrEv,_ZTv0_n20_N3ccc5EE0x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x53efgEv,_ZTv0_n16_N3ccc5EE0x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x53abcEv,_ZTv0_n12_N3ccc5EE0x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x5y15E = {  "_ZN3ccc8FF0x5y15E", // class name
  bases__ZN3ccc8FF0x5y15E, 2,
  &(vtc__ZN3ccc8FF0x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x5y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x5y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x5y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x5y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names96,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y0  : virtual ::ccc::EE0x6 {
  virtual void  abc(); // _ZN3ccc7FF0x6y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y03pqrEv
  ~FF0x6y0(); // tgen
  FF0x6y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y03abcEv");}
void  ccc::FF0x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y03efgEv");}
void  ccc::FF0x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y03pqrEv");}
ccc::FF0x6y0 ::~FF0x6y0(){ note_dtor("_ZN3ccc7FF0x6y0E", this);} // tgen
ccc::FF0x6y0 ::FF0x6y0(){ note_ctor("_ZN3ccc7FF0x6y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y0E, buf);
    ::ccc::FF0x6y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y0E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y0E);
    dp->::ccc::FF0x6y0::~FF0x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y0E(Test__ZN3ccc7FF0x6y0E, "_ZN3ccc7FF0x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y0C1Ev();
extern void _ZN3ccc7FF0x6y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y0E[] = {
  NSPAIR(_ZN3ccc7FF0x6y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y0E[];
extern void _ZN3ccc7FF0x6y03abcEv();
extern void _ZN3ccc7FF0x6y03efgEv();
extern void _ZN3ccc7FF0x6y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y0E[] = {
  {&(_ZTVN3ccc7FF0x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y0E[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y0E = {  "_ZN3ccc7FF0x6y0E", // class name
  bases__ZN3ccc7FF0x6y0E, 2,
  &(vtc__ZN3ccc7FF0x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names97,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y1  : virtual ::ccc::EE0x6 {
  virtual void  abc(); // _ZN3ccc7FF0x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x6y13efgEv
  ~FF0x6y1(); // tgen
  FF0x6y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y13abcEv");}
void  ccc::FF0x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y13pqrEv");}
void  ccc::FF0x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y13efgEv");}
ccc::FF0x6y1 ::~FF0x6y1(){ note_dtor("_ZN3ccc7FF0x6y1E", this);} // tgen
ccc::FF0x6y1 ::FF0x6y1(){ note_ctor("_ZN3ccc7FF0x6y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y1E, buf);
    ::ccc::FF0x6y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y1E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y1E);
    dp->::ccc::FF0x6y1::~FF0x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y1E(Test__ZN3ccc7FF0x6y1E, "_ZN3ccc7FF0x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y1C1Ev();
extern void _ZN3ccc7FF0x6y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y1E[] = {
  NSPAIR(_ZN3ccc7FF0x6y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y1E[];
extern void _ZN3ccc7FF0x6y13abcEv();
extern void _ZN3ccc7FF0x6y13efgEv();
extern void _ZN3ccc7FF0x6y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y1E[] = {
  {&(_ZTVN3ccc7FF0x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y1E[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y1E = {  "_ZN3ccc7FF0x6y1E", // class name
  bases__ZN3ccc7FF0x6y1E, 2,
  &(vtc__ZN3ccc7FF0x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names98,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y2  : virtual ::ccc::EE0x6 {
  virtual void  efg(); // _ZN3ccc7FF0x6y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y23pqrEv
  ~FF0x6y2(); // tgen
  FF0x6y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y23efgEv");}
void  ccc::FF0x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y23abcEv");}
void  ccc::FF0x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y23pqrEv");}
ccc::FF0x6y2 ::~FF0x6y2(){ note_dtor("_ZN3ccc7FF0x6y2E", this);} // tgen
ccc::FF0x6y2 ::FF0x6y2(){ note_ctor("_ZN3ccc7FF0x6y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y2E, buf);
    ::ccc::FF0x6y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y2E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y2E);
    dp->::ccc::FF0x6y2::~FF0x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y2E(Test__ZN3ccc7FF0x6y2E, "_ZN3ccc7FF0x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y2C1Ev();
extern void _ZN3ccc7FF0x6y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y2E[] = {
  NSPAIR(_ZN3ccc7FF0x6y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y2E[];
extern void _ZN3ccc7FF0x6y23abcEv();
extern void _ZN3ccc7FF0x6y23efgEv();
extern void _ZN3ccc7FF0x6y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y2E[] = {
  {&(_ZTVN3ccc7FF0x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y2E[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y2E = {  "_ZN3ccc7FF0x6y2E", // class name
  bases__ZN3ccc7FF0x6y2E, 2,
  &(vtc__ZN3ccc7FF0x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names99,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y3  : virtual ::ccc::EE0x6 {
  virtual void  efg(); // _ZN3ccc7FF0x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x6y33abcEv
  ~FF0x6y3(); // tgen
  FF0x6y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y33efgEv");}
void  ccc::FF0x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y33pqrEv");}
void  ccc::FF0x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y33abcEv");}
ccc::FF0x6y3 ::~FF0x6y3(){ note_dtor("_ZN3ccc7FF0x6y3E", this);} // tgen
ccc::FF0x6y3 ::FF0x6y3(){ note_ctor("_ZN3ccc7FF0x6y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y3E, buf);
    ::ccc::FF0x6y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y3E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y3E);
    dp->::ccc::FF0x6y3::~FF0x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y3E(Test__ZN3ccc7FF0x6y3E, "_ZN3ccc7FF0x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y3C1Ev();
extern void _ZN3ccc7FF0x6y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y3E[] = {
  NSPAIR(_ZN3ccc7FF0x6y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y3E[];
extern void _ZN3ccc7FF0x6y33abcEv();
extern void _ZN3ccc7FF0x6y33efgEv();
extern void _ZN3ccc7FF0x6y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y3E[] = {
  {&(_ZTVN3ccc7FF0x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y3E[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y3E = {  "_ZN3ccc7FF0x6y3E", // class name
  bases__ZN3ccc7FF0x6y3E, 2,
  &(vtc__ZN3ccc7FF0x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y4  : virtual ::ccc::EE0x6 {
  virtual void  pqr(); // _ZN3ccc7FF0x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x6y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x6y43efgEv
  ~FF0x6y4(); // tgen
  FF0x6y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y43pqrEv");}
void  ccc::FF0x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y43abcEv");}
void  ccc::FF0x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y43efgEv");}
ccc::FF0x6y4 ::~FF0x6y4(){ note_dtor("_ZN3ccc7FF0x6y4E", this);} // tgen
ccc::FF0x6y4 ::FF0x6y4(){ note_ctor("_ZN3ccc7FF0x6y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y4E, buf);
    ::ccc::FF0x6y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y4E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y4E);
    dp->::ccc::FF0x6y4::~FF0x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y4E(Test__ZN3ccc7FF0x6y4E, "_ZN3ccc7FF0x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y4C1Ev();
extern void _ZN3ccc7FF0x6y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y4E[] = {
  NSPAIR(_ZN3ccc7FF0x6y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y4E[];
extern void _ZN3ccc7FF0x6y43abcEv();
extern void _ZN3ccc7FF0x6y43efgEv();
extern void _ZN3ccc7FF0x6y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y4E[] = {
  {&(_ZTVN3ccc7FF0x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y4E[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y4E = {  "_ZN3ccc7FF0x6y4E", // class name
  bases__ZN3ccc7FF0x6y4E, 2,
  &(vtc__ZN3ccc7FF0x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y5  : virtual ::ccc::EE0x6 {
  virtual void  pqr(); // _ZN3ccc7FF0x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x6y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x6y53abcEv
  ~FF0x6y5(); // tgen
  FF0x6y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y53pqrEv");}
void  ccc::FF0x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y53efgEv");}
void  ccc::FF0x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y53abcEv");}
ccc::FF0x6y5 ::~FF0x6y5(){ note_dtor("_ZN3ccc7FF0x6y5E", this);} // tgen
ccc::FF0x6y5 ::FF0x6y5(){ note_ctor("_ZN3ccc7FF0x6y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y5E, buf);
    ::ccc::FF0x6y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y5E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y5E);
    dp->::ccc::FF0x6y5::~FF0x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y5E(Test__ZN3ccc7FF0x6y5E, "_ZN3ccc7FF0x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y5C1Ev();
extern void _ZN3ccc7FF0x6y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y5E[] = {
  NSPAIR(_ZN3ccc7FF0x6y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y5E[];
extern void _ZN3ccc7FF0x6y53abcEv();
extern void _ZN3ccc7FF0x6y53efgEv();
extern void _ZN3ccc7FF0x6y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y5E[] = {
  {&(_ZTVN3ccc7FF0x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y5E[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y5E = {  "_ZN3ccc7FF0x6y5E", // class name
  bases__ZN3ccc7FF0x6y5E, 2,
  &(vtc__ZN3ccc7FF0x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y6  : virtual ::ccc::EE0x6 {
  virtual void  abc(); // _ZN3ccc7FF0x6y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x6y63efgEv
  ~FF0x6y6(); // tgen
  FF0x6y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y63abcEv");}
void  ccc::FF0x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y63efgEv");}
ccc::FF0x6y6 ::~FF0x6y6(){ note_dtor("_ZN3ccc7FF0x6y6E", this);} // tgen
ccc::FF0x6y6 ::FF0x6y6(){ note_ctor("_ZN3ccc7FF0x6y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y6E, buf);
    ::ccc::FF0x6y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y6E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y6E);
    dp->::ccc::FF0x6y6::~FF0x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y6E(Test__ZN3ccc7FF0x6y6E, "_ZN3ccc7FF0x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y6C1Ev();
extern void _ZN3ccc7FF0x6y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y6E[] = {
  NSPAIR(_ZN3ccc7FF0x6y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y6E[];
extern void _ZN3ccc7FF0x6y63abcEv();
extern void _ZN3ccc7FF0x6y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y6E[] = {
  {&(_ZTVN3ccc7FF0x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y6E[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y6E = {  "_ZN3ccc7FF0x6y6E", // class name
  bases__ZN3ccc7FF0x6y6E, 2,
  &(vtc__ZN3ccc7FF0x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y6E),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
namespace ccc { 
struct  FF0x6y7  : virtual ::ccc::EE0x6 {
  virtual void  abc(); // _ZN3ccc7FF0x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y73pqrEv
  ~FF0x6y7(); // tgen
  FF0x6y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y73abcEv");}
void  ccc::FF0x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y73pqrEv");}
ccc::FF0x6y7 ::~FF0x6y7(){ note_dtor("_ZN3ccc7FF0x6y7E", this);} // tgen
ccc::FF0x6y7 ::FF0x6y7(){ note_ctor("_ZN3ccc7FF0x6y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y7E, buf);
    ::ccc::FF0x6y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y7E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y7E);
    dp->::ccc::FF0x6y7::~FF0x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y7E(Test__ZN3ccc7FF0x6y7E, "_ZN3ccc7FF0x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y7C1Ev();
extern void _ZN3ccc7FF0x6y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y7E[] = {
  NSPAIR(_ZN3ccc7FF0x6y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y7E[];
extern void _ZN3ccc7FF0x6y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x6y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y7E[] = {
  {&(_ZTVN3ccc7FF0x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y7E[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y7E = {  "_ZN3ccc7FF0x6y7E", // class name
  bases__ZN3ccc7FF0x6y7E, 2,
  &(vtc__ZN3ccc7FF0x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names104,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y8  : virtual ::ccc::EE0x6 {
  virtual void  efg(); // _ZN3ccc7FF0x6y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x6y83abcEv
  ~FF0x6y8(); // tgen
  FF0x6y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y83efgEv");}
void  ccc::FF0x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x6y83abcEv");}
ccc::FF0x6y8 ::~FF0x6y8(){ note_dtor("_ZN3ccc7FF0x6y8E", this);} // tgen
ccc::FF0x6y8 ::FF0x6y8(){ note_ctor("_ZN3ccc7FF0x6y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y8E, buf);
    ::ccc::FF0x6y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y8E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y8E);
    dp->::ccc::FF0x6y8::~FF0x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y8E(Test__ZN3ccc7FF0x6y8E, "_ZN3ccc7FF0x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y8C1Ev();
extern void _ZN3ccc7FF0x6y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y8E[] = {
  NSPAIR(_ZN3ccc7FF0x6y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y8E[];
extern void _ZN3ccc7FF0x6y83abcEv();
extern void _ZN3ccc7FF0x6y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y8E[] = {
  {&(_ZTVN3ccc7FF0x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y8E[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y8E = {  "_ZN3ccc7FF0x6y8E", // class name
  bases__ZN3ccc7FF0x6y8E, 2,
  &(vtc__ZN3ccc7FF0x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names105,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y9  : virtual ::ccc::EE0x6 {
  virtual void  efg(); // _ZN3ccc7FF0x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x6y93pqrEv
  ~FF0x6y9(); // tgen
  FF0x6y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x6y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x6y93efgEv");}
void  ccc::FF0x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x6y93pqrEv");}
ccc::FF0x6y9 ::~FF0x6y9(){ note_dtor("_ZN3ccc7FF0x6y9E", this);} // tgen
ccc::FF0x6y9 ::FF0x6y9(){ note_ctor("_ZN3ccc7FF0x6y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x6y9E, buf);
    ::ccc::FF0x6y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x6y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y9E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc7FF0x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x6y9E);
    dp->::ccc::FF0x6y9::~FF0x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x6y9E(Test__ZN3ccc7FF0x6y9E, "_ZN3ccc7FF0x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x6y9C1Ev();
extern void _ZN3ccc7FF0x6y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x6y9E[] = {
  NSPAIR(_ZN3ccc7FF0x6y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc7FF0x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x6y93efgEv();
extern void _ZN3ccc7FF0x6y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x6y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x6y9E[] = {
  {&(_ZTVN3ccc7FF0x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x6y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_7FF0x6y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x6y9E[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x6y9E = {  "_ZN3ccc7FF0x6y9E", // class name
  bases__ZN3ccc7FF0x6y9E, 2,
  &(vtc__ZN3ccc7FF0x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x6y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x6y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x6y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x6y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names106,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y10  : virtual ::ccc::EE0x6 {
  virtual void  pqr(); // _ZN3ccc8FF0x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x6y103abcEv
  ~FF0x6y10(); // tgen
  FF0x6y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x6y103pqrEv");}
void  ccc::FF0x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x6y103abcEv");}
ccc::FF0x6y10 ::~FF0x6y10(){ note_dtor("_ZN3ccc8FF0x6y10E", this);} // tgen
ccc::FF0x6y10 ::FF0x6y10(){ note_ctor("_ZN3ccc8FF0x6y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y10E, buf);
    ::ccc::FF0x6y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y10E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y10E);
    dp->::ccc::FF0x6y10::~FF0x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y10E(Test__ZN3ccc8FF0x6y10E, "_ZN3ccc8FF0x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y10C1Ev();
extern void _ZN3ccc8FF0x6y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y10E[] = {
  NSPAIR(_ZN3ccc8FF0x6y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y10E[];
extern void _ZN3ccc8FF0x6y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x6y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y10E[] = {
  {&(_ZTVN3ccc8FF0x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y10E[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y10E = {  "_ZN3ccc8FF0x6y10E", // class name
  bases__ZN3ccc8FF0x6y10E, 2,
  &(vtc__ZN3ccc8FF0x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names107,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y11  : virtual ::ccc::EE0x6 {
  virtual void  pqr(); // _ZN3ccc8FF0x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x6y113efgEv
  ~FF0x6y11(); // tgen
  FF0x6y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x6y113pqrEv");}
void  ccc::FF0x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x6y113efgEv");}
ccc::FF0x6y11 ::~FF0x6y11(){ note_dtor("_ZN3ccc8FF0x6y11E", this);} // tgen
ccc::FF0x6y11 ::FF0x6y11(){ note_ctor("_ZN3ccc8FF0x6y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y11E, buf);
    ::ccc::FF0x6y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y11E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y11E);
    dp->::ccc::FF0x6y11::~FF0x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y11E(Test__ZN3ccc8FF0x6y11E, "_ZN3ccc8FF0x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y11C1Ev();
extern void _ZN3ccc8FF0x6y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y11E[] = {
  NSPAIR(_ZN3ccc8FF0x6y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x6y113efgEv();
extern void _ZN3ccc8FF0x6y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y11E[] = {
  {&(_ZTVN3ccc8FF0x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y11E[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y11E = {  "_ZN3ccc8FF0x6y11E", // class name
  bases__ZN3ccc8FF0x6y11E, 2,
  &(vtc__ZN3ccc8FF0x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y12  : virtual ::ccc::EE0x6 {
  virtual void  abc(); // _ZN3ccc8FF0x6y123abcEv
  ~FF0x6y12(); // tgen
  FF0x6y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x6y123abcEv");}
ccc::FF0x6y12 ::~FF0x6y12(){ note_dtor("_ZN3ccc8FF0x6y12E", this);} // tgen
ccc::FF0x6y12 ::FF0x6y12(){ note_ctor("_ZN3ccc8FF0x6y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y12E, buf);
    ::ccc::FF0x6y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y12E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y12E);
    dp->::ccc::FF0x6y12::~FF0x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y12E(Test__ZN3ccc8FF0x6y12E, "_ZN3ccc8FF0x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y12C1Ev();
extern void _ZN3ccc8FF0x6y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y12E[] = {
  NSPAIR(_ZN3ccc8FF0x6y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y12E[];
extern void _ZN3ccc8FF0x6y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y12E[] = {
  {&(_ZTVN3ccc8FF0x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y12E[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y12E = {  "_ZN3ccc8FF0x6y12E", // class name
  bases__ZN3ccc8FF0x6y12E, 2,
  &(vtc__ZN3ccc8FF0x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y13  : virtual ::ccc::EE0x6 {
  virtual void  efg(); // _ZN3ccc8FF0x6y133efgEv
  ~FF0x6y13(); // tgen
  FF0x6y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x6y133efgEv");}
ccc::FF0x6y13 ::~FF0x6y13(){ note_dtor("_ZN3ccc8FF0x6y13E", this);} // tgen
ccc::FF0x6y13 ::FF0x6y13(){ note_ctor("_ZN3ccc8FF0x6y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y13E, buf);
    ::ccc::FF0x6y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y13E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y13E);
    dp->::ccc::FF0x6y13::~FF0x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y13E(Test__ZN3ccc8FF0x6y13E, "_ZN3ccc8FF0x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y13C1Ev();
extern void _ZN3ccc8FF0x6y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y13E[] = {
  NSPAIR(_ZN3ccc8FF0x6y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x6y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y13E[] = {
  {&(_ZTVN3ccc8FF0x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y13E[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y13E = {  "_ZN3ccc8FF0x6y13E", // class name
  bases__ZN3ccc8FF0x6y13E, 2,
  &(vtc__ZN3ccc8FF0x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y14  : virtual ::ccc::EE0x6 {
  virtual void  pqr(); // _ZN3ccc8FF0x6y143pqrEv
  ~FF0x6y14(); // tgen
  FF0x6y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x6y143pqrEv");}
ccc::FF0x6y14 ::~FF0x6y14(){ note_dtor("_ZN3ccc8FF0x6y14E", this);} // tgen
ccc::FF0x6y14 ::FF0x6y14(){ note_ctor("_ZN3ccc8FF0x6y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y14E, buf);
    ::ccc::FF0x6y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y14E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y14E);
    dp->::ccc::FF0x6y14::~FF0x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y14E(Test__ZN3ccc8FF0x6y14E, "_ZN3ccc8FF0x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y14C1Ev();
extern void _ZN3ccc8FF0x6y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y14E[] = {
  NSPAIR(_ZN3ccc8FF0x6y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x6y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x6y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y14E[] = {
  {&(_ZTVN3ccc8FF0x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y14E[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y14E = {  "_ZN3ccc8FF0x6y14E", // class name
  bases__ZN3ccc8FF0x6y14E, 2,
  &(vtc__ZN3ccc8FF0x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x6y15  : virtual ::ccc::EE0x6 {
  ~FF0x6y15(); // tgen
  FF0x6y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x6y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2}}
}
namespace ccc { 
ccc::FF0x6y15 ::~FF0x6y15(){ note_dtor("_ZN3ccc8FF0x6y15E", this);} // tgen
ccc::FF0x6y15 ::FF0x6y15(){ note_ctor("_ZN3ccc8FF0x6y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x6y15E, buf);
    ::ccc::FF0x6y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x6y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y15E");
    check_base_class_offset(lv, (::ccc::EE0x6*), 0, "_ZN3ccc8FF0x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x6y15E);
    dp->::ccc::FF0x6y15::~FF0x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x6y15E(Test__ZN3ccc8FF0x6y15E, "_ZN3ccc8FF0x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x6y15C1Ev();
extern void _ZN3ccc8FF0x6y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x6y15E[] = {
  NSPAIR(_ZN3ccc8FF0x6y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x6E[];
static Base_Class bases__ZN3ccc8FF0x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x6y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv)();
extern void _ZN3ccc5EE0x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv)();
extern void _ZN3ccc5EE0x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x6y15E[] = {
  {&(_ZTVN3ccc8FF0x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x6y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x6E__NS_8FF0x6y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x6y15E[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x63efgEv,_ZTv0_n16_N3ccc5EE0x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x63abcEv,_ZTv0_n12_N3ccc5EE0x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x6y15E = {  "_ZN3ccc8FF0x6y15E", // class name
  bases__ZN3ccc8FF0x6y15E, 2,
  &(vtc__ZN3ccc8FF0x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x6y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x6y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x6y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x6y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y0  : virtual ::ccc::EE0x7 {
  virtual void  abc(); // _ZN3ccc7FF0x7y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y03pqrEv
  ~FF0x7y0(); // tgen
  FF0x7y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y03abcEv");}
void  ccc::FF0x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y03efgEv");}
void  ccc::FF0x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y03pqrEv");}
ccc::FF0x7y0 ::~FF0x7y0(){ note_dtor("_ZN3ccc7FF0x7y0E", this);} // tgen
ccc::FF0x7y0 ::FF0x7y0(){ note_ctor("_ZN3ccc7FF0x7y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y0E, buf);
    ::ccc::FF0x7y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y0E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y0E);
    dp->::ccc::FF0x7y0::~FF0x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y0E(Test__ZN3ccc7FF0x7y0E, "_ZN3ccc7FF0x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y0C1Ev();
extern void _ZN3ccc7FF0x7y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y0E[] = {
  NSPAIR(_ZN3ccc7FF0x7y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y0E[];
extern void _ZN3ccc7FF0x7y03abcEv();
extern void _ZN3ccc7FF0x7y03efgEv();
extern void _ZN3ccc7FF0x7y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y0E[] = {
  {&(_ZTVN3ccc7FF0x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y0E[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y0E = {  "_ZN3ccc7FF0x7y0E", // class name
  bases__ZN3ccc7FF0x7y0E, 2,
  &(vtc__ZN3ccc7FF0x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y1  : virtual ::ccc::EE0x7 {
  virtual void  abc(); // _ZN3ccc7FF0x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x7y13efgEv
  ~FF0x7y1(); // tgen
  FF0x7y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y13abcEv");}
void  ccc::FF0x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y13pqrEv");}
void  ccc::FF0x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y13efgEv");}
ccc::FF0x7y1 ::~FF0x7y1(){ note_dtor("_ZN3ccc7FF0x7y1E", this);} // tgen
ccc::FF0x7y1 ::FF0x7y1(){ note_ctor("_ZN3ccc7FF0x7y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y1E, buf);
    ::ccc::FF0x7y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y1E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y1E);
    dp->::ccc::FF0x7y1::~FF0x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y1E(Test__ZN3ccc7FF0x7y1E, "_ZN3ccc7FF0x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y1C1Ev();
extern void _ZN3ccc7FF0x7y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y1E[] = {
  NSPAIR(_ZN3ccc7FF0x7y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y1E[];
extern void _ZN3ccc7FF0x7y13abcEv();
extern void _ZN3ccc7FF0x7y13efgEv();
extern void _ZN3ccc7FF0x7y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y1E[] = {
  {&(_ZTVN3ccc7FF0x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y1E[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y1E = {  "_ZN3ccc7FF0x7y1E", // class name
  bases__ZN3ccc7FF0x7y1E, 2,
  &(vtc__ZN3ccc7FF0x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y2  : virtual ::ccc::EE0x7 {
  virtual void  efg(); // _ZN3ccc7FF0x7y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y23pqrEv
  ~FF0x7y2(); // tgen
  FF0x7y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y23efgEv");}
void  ccc::FF0x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y23abcEv");}
void  ccc::FF0x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y23pqrEv");}
ccc::FF0x7y2 ::~FF0x7y2(){ note_dtor("_ZN3ccc7FF0x7y2E", this);} // tgen
ccc::FF0x7y2 ::FF0x7y2(){ note_ctor("_ZN3ccc7FF0x7y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y2E, buf);
    ::ccc::FF0x7y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y2E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y2E);
    dp->::ccc::FF0x7y2::~FF0x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y2E(Test__ZN3ccc7FF0x7y2E, "_ZN3ccc7FF0x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y2C1Ev();
extern void _ZN3ccc7FF0x7y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y2E[] = {
  NSPAIR(_ZN3ccc7FF0x7y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y2E[];
extern void _ZN3ccc7FF0x7y23abcEv();
extern void _ZN3ccc7FF0x7y23efgEv();
extern void _ZN3ccc7FF0x7y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y2E[] = {
  {&(_ZTVN3ccc7FF0x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y2E[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y2E = {  "_ZN3ccc7FF0x7y2E", // class name
  bases__ZN3ccc7FF0x7y2E, 2,
  &(vtc__ZN3ccc7FF0x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y3  : virtual ::ccc::EE0x7 {
  virtual void  efg(); // _ZN3ccc7FF0x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x7y33abcEv
  ~FF0x7y3(); // tgen
  FF0x7y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y33efgEv");}
void  ccc::FF0x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y33pqrEv");}
void  ccc::FF0x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y33abcEv");}
ccc::FF0x7y3 ::~FF0x7y3(){ note_dtor("_ZN3ccc7FF0x7y3E", this);} // tgen
ccc::FF0x7y3 ::FF0x7y3(){ note_ctor("_ZN3ccc7FF0x7y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y3E, buf);
    ::ccc::FF0x7y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y3E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y3E);
    dp->::ccc::FF0x7y3::~FF0x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y3E(Test__ZN3ccc7FF0x7y3E, "_ZN3ccc7FF0x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y3C1Ev();
extern void _ZN3ccc7FF0x7y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y3E[] = {
  NSPAIR(_ZN3ccc7FF0x7y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y3E[];
extern void _ZN3ccc7FF0x7y33abcEv();
extern void _ZN3ccc7FF0x7y33efgEv();
extern void _ZN3ccc7FF0x7y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y3E[] = {
  {&(_ZTVN3ccc7FF0x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y3E[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y3E = {  "_ZN3ccc7FF0x7y3E", // class name
  bases__ZN3ccc7FF0x7y3E, 2,
  &(vtc__ZN3ccc7FF0x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y4  : virtual ::ccc::EE0x7 {
  virtual void  pqr(); // _ZN3ccc7FF0x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x7y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x7y43efgEv
  ~FF0x7y4(); // tgen
  FF0x7y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y43pqrEv");}
void  ccc::FF0x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y43abcEv");}
void  ccc::FF0x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y43efgEv");}
ccc::FF0x7y4 ::~FF0x7y4(){ note_dtor("_ZN3ccc7FF0x7y4E", this);} // tgen
ccc::FF0x7y4 ::FF0x7y4(){ note_ctor("_ZN3ccc7FF0x7y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y4E, buf);
    ::ccc::FF0x7y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y4E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y4E);
    dp->::ccc::FF0x7y4::~FF0x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y4E(Test__ZN3ccc7FF0x7y4E, "_ZN3ccc7FF0x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y4C1Ev();
extern void _ZN3ccc7FF0x7y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y4E[] = {
  NSPAIR(_ZN3ccc7FF0x7y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y4E[];
extern void _ZN3ccc7FF0x7y43abcEv();
extern void _ZN3ccc7FF0x7y43efgEv();
extern void _ZN3ccc7FF0x7y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y4E[] = {
  {&(_ZTVN3ccc7FF0x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y4E[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y4E = {  "_ZN3ccc7FF0x7y4E", // class name
  bases__ZN3ccc7FF0x7y4E, 2,
  &(vtc__ZN3ccc7FF0x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y5  : virtual ::ccc::EE0x7 {
  virtual void  pqr(); // _ZN3ccc7FF0x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x7y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x7y53abcEv
  ~FF0x7y5(); // tgen
  FF0x7y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y53pqrEv");}
void  ccc::FF0x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y53efgEv");}
void  ccc::FF0x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y53abcEv");}
ccc::FF0x7y5 ::~FF0x7y5(){ note_dtor("_ZN3ccc7FF0x7y5E", this);} // tgen
ccc::FF0x7y5 ::FF0x7y5(){ note_ctor("_ZN3ccc7FF0x7y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y5E, buf);
    ::ccc::FF0x7y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y5E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y5E);
    dp->::ccc::FF0x7y5::~FF0x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y5E(Test__ZN3ccc7FF0x7y5E, "_ZN3ccc7FF0x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y5C1Ev();
extern void _ZN3ccc7FF0x7y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y5E[] = {
  NSPAIR(_ZN3ccc7FF0x7y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y5E[];
extern void _ZN3ccc7FF0x7y53abcEv();
extern void _ZN3ccc7FF0x7y53efgEv();
extern void _ZN3ccc7FF0x7y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y5E[] = {
  {&(_ZTVN3ccc7FF0x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y5E[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y5E = {  "_ZN3ccc7FF0x7y5E", // class name
  bases__ZN3ccc7FF0x7y5E, 2,
  &(vtc__ZN3ccc7FF0x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y6  : virtual ::ccc::EE0x7 {
  virtual void  abc(); // _ZN3ccc7FF0x7y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x7y63efgEv
  ~FF0x7y6(); // tgen
  FF0x7y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y63abcEv");}
void  ccc::FF0x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y63efgEv");}
ccc::FF0x7y6 ::~FF0x7y6(){ note_dtor("_ZN3ccc7FF0x7y6E", this);} // tgen
ccc::FF0x7y6 ::FF0x7y6(){ note_ctor("_ZN3ccc7FF0x7y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y6E, buf);
    ::ccc::FF0x7y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y6E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y6E);
    dp->::ccc::FF0x7y6::~FF0x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y6E(Test__ZN3ccc7FF0x7y6E, "_ZN3ccc7FF0x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y6C1Ev();
extern void _ZN3ccc7FF0x7y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y6E[] = {
  NSPAIR(_ZN3ccc7FF0x7y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y6E[];
extern void _ZN3ccc7FF0x7y63abcEv();
extern void _ZN3ccc7FF0x7y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y6E[] = {
  {&(_ZTVN3ccc7FF0x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y6E[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y6E = {  "_ZN3ccc7FF0x7y6E", // class name
  bases__ZN3ccc7FF0x7y6E, 2,
  &(vtc__ZN3ccc7FF0x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y7  : virtual ::ccc::EE0x7 {
  virtual void  abc(); // _ZN3ccc7FF0x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y73pqrEv
  ~FF0x7y7(); // tgen
  FF0x7y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y73abcEv");}
void  ccc::FF0x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y73pqrEv");}
ccc::FF0x7y7 ::~FF0x7y7(){ note_dtor("_ZN3ccc7FF0x7y7E", this);} // tgen
ccc::FF0x7y7 ::FF0x7y7(){ note_ctor("_ZN3ccc7FF0x7y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y7E, buf);
    ::ccc::FF0x7y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y7E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y7E);
    dp->::ccc::FF0x7y7::~FF0x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y7E(Test__ZN3ccc7FF0x7y7E, "_ZN3ccc7FF0x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y7C1Ev();
extern void _ZN3ccc7FF0x7y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y7E[] = {
  NSPAIR(_ZN3ccc7FF0x7y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y7E[];
extern void _ZN3ccc7FF0x7y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7FF0x7y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y7E[] = {
  {&(_ZTVN3ccc7FF0x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y7E[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y7E = {  "_ZN3ccc7FF0x7y7E", // class name
  bases__ZN3ccc7FF0x7y7E, 2,
  &(vtc__ZN3ccc7FF0x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y8  : virtual ::ccc::EE0x7 {
  virtual void  efg(); // _ZN3ccc7FF0x7y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x7y83abcEv
  ~FF0x7y8(); // tgen
  FF0x7y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y83efgEv");}
void  ccc::FF0x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x7y83abcEv");}
ccc::FF0x7y8 ::~FF0x7y8(){ note_dtor("_ZN3ccc7FF0x7y8E", this);} // tgen
ccc::FF0x7y8 ::FF0x7y8(){ note_ctor("_ZN3ccc7FF0x7y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y8E, buf);
    ::ccc::FF0x7y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y8E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y8E);
    dp->::ccc::FF0x7y8::~FF0x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y8E(Test__ZN3ccc7FF0x7y8E, "_ZN3ccc7FF0x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y8C1Ev();
extern void _ZN3ccc7FF0x7y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y8E[] = {
  NSPAIR(_ZN3ccc7FF0x7y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y8E[];
extern void _ZN3ccc7FF0x7y83abcEv();
extern void _ZN3ccc7FF0x7y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y8E[] = {
  {&(_ZTVN3ccc7FF0x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y8E[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y8E = {  "_ZN3ccc7FF0x7y8E", // class name
  bases__ZN3ccc7FF0x7y8E, 2,
  &(vtc__ZN3ccc7FF0x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names121,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y9  : virtual ::ccc::EE0x7 {
  virtual void  efg(); // _ZN3ccc7FF0x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x7y93pqrEv
  ~FF0x7y9(); // tgen
  FF0x7y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x7y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x7y93efgEv");}
void  ccc::FF0x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x7y93pqrEv");}
ccc::FF0x7y9 ::~FF0x7y9(){ note_dtor("_ZN3ccc7FF0x7y9E", this);} // tgen
ccc::FF0x7y9 ::FF0x7y9(){ note_ctor("_ZN3ccc7FF0x7y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x7y9E, buf);
    ::ccc::FF0x7y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x7y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y9E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc7FF0x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x7y9E);
    dp->::ccc::FF0x7y9::~FF0x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x7y9E(Test__ZN3ccc7FF0x7y9E, "_ZN3ccc7FF0x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x7y9C1Ev();
extern void _ZN3ccc7FF0x7y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x7y9E[] = {
  NSPAIR(_ZN3ccc7FF0x7y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc7FF0x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x7y93efgEv();
extern void _ZN3ccc7FF0x7y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x7y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x7y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x7y9E[] = {
  {&(_ZTVN3ccc7FF0x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x7y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_7FF0x7y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x7y9E[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x7y9E = {  "_ZN3ccc7FF0x7y9E", // class name
  bases__ZN3ccc7FF0x7y9E, 2,
  &(vtc__ZN3ccc7FF0x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x7y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x7y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x7y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x7y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names122,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y10  : virtual ::ccc::EE0x7 {
  virtual void  pqr(); // _ZN3ccc8FF0x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x7y103abcEv
  ~FF0x7y10(); // tgen
  FF0x7y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x7y103pqrEv");}
void  ccc::FF0x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x7y103abcEv");}
ccc::FF0x7y10 ::~FF0x7y10(){ note_dtor("_ZN3ccc8FF0x7y10E", this);} // tgen
ccc::FF0x7y10 ::FF0x7y10(){ note_ctor("_ZN3ccc8FF0x7y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y10E, buf);
    ::ccc::FF0x7y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y10E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y10E);
    dp->::ccc::FF0x7y10::~FF0x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y10E(Test__ZN3ccc8FF0x7y10E, "_ZN3ccc8FF0x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y10C1Ev();
extern void _ZN3ccc8FF0x7y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y10E[] = {
  NSPAIR(_ZN3ccc8FF0x7y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y10E[];
extern void _ZN3ccc8FF0x7y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x7y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y10E[] = {
  {&(_ZTVN3ccc8FF0x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y10E[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y10E = {  "_ZN3ccc8FF0x7y10E", // class name
  bases__ZN3ccc8FF0x7y10E, 2,
  &(vtc__ZN3ccc8FF0x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names123,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y11  : virtual ::ccc::EE0x7 {
  virtual void  pqr(); // _ZN3ccc8FF0x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x7y113efgEv
  ~FF0x7y11(); // tgen
  FF0x7y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x7y113pqrEv");}
void  ccc::FF0x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x7y113efgEv");}
ccc::FF0x7y11 ::~FF0x7y11(){ note_dtor("_ZN3ccc8FF0x7y11E", this);} // tgen
ccc::FF0x7y11 ::FF0x7y11(){ note_ctor("_ZN3ccc8FF0x7y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y11E, buf);
    ::ccc::FF0x7y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y11E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y11E);
    dp->::ccc::FF0x7y11::~FF0x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y11E(Test__ZN3ccc8FF0x7y11E, "_ZN3ccc8FF0x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y11C1Ev();
extern void _ZN3ccc8FF0x7y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y11E[] = {
  NSPAIR(_ZN3ccc8FF0x7y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x7y113efgEv();
extern void _ZN3ccc8FF0x7y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y11E[] = {
  {&(_ZTVN3ccc8FF0x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y11E[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y11E = {  "_ZN3ccc8FF0x7y11E", // class name
  bases__ZN3ccc8FF0x7y11E, 2,
  &(vtc__ZN3ccc8FF0x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y12  : virtual ::ccc::EE0x7 {
  virtual void  abc(); // _ZN3ccc8FF0x7y123abcEv
  ~FF0x7y12(); // tgen
  FF0x7y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x7y123abcEv");}
ccc::FF0x7y12 ::~FF0x7y12(){ note_dtor("_ZN3ccc8FF0x7y12E", this);} // tgen
ccc::FF0x7y12 ::FF0x7y12(){ note_ctor("_ZN3ccc8FF0x7y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y12E, buf);
    ::ccc::FF0x7y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y12E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y12E);
    dp->::ccc::FF0x7y12::~FF0x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y12E(Test__ZN3ccc8FF0x7y12E, "_ZN3ccc8FF0x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y12C1Ev();
extern void _ZN3ccc8FF0x7y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y12E[] = {
  NSPAIR(_ZN3ccc8FF0x7y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y12E[];
extern void _ZN3ccc8FF0x7y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y12E[] = {
  {&(_ZTVN3ccc8FF0x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y12E[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y12E = {  "_ZN3ccc8FF0x7y12E", // class name
  bases__ZN3ccc8FF0x7y12E, 2,
  &(vtc__ZN3ccc8FF0x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names125,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y13  : virtual ::ccc::EE0x7 {
  virtual void  efg(); // _ZN3ccc8FF0x7y133efgEv
  ~FF0x7y13(); // tgen
  FF0x7y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x7y133efgEv");}
ccc::FF0x7y13 ::~FF0x7y13(){ note_dtor("_ZN3ccc8FF0x7y13E", this);} // tgen
ccc::FF0x7y13 ::FF0x7y13(){ note_ctor("_ZN3ccc8FF0x7y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y13E, buf);
    ::ccc::FF0x7y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y13E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y13E);
    dp->::ccc::FF0x7y13::~FF0x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y13E(Test__ZN3ccc8FF0x7y13E, "_ZN3ccc8FF0x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y13C1Ev();
extern void _ZN3ccc8FF0x7y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y13E[] = {
  NSPAIR(_ZN3ccc8FF0x7y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x7y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y13E[] = {
  {&(_ZTVN3ccc8FF0x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y13E[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y13E = {  "_ZN3ccc8FF0x7y13E", // class name
  bases__ZN3ccc8FF0x7y13E, 2,
  &(vtc__ZN3ccc8FF0x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y14  : virtual ::ccc::EE0x7 {
  virtual void  pqr(); // _ZN3ccc8FF0x7y143pqrEv
  ~FF0x7y14(); // tgen
  FF0x7y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x7y143pqrEv");}
ccc::FF0x7y14 ::~FF0x7y14(){ note_dtor("_ZN3ccc8FF0x7y14E", this);} // tgen
ccc::FF0x7y14 ::FF0x7y14(){ note_ctor("_ZN3ccc8FF0x7y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y14E, buf);
    ::ccc::FF0x7y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y14E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y14E);
    dp->::ccc::FF0x7y14::~FF0x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y14E(Test__ZN3ccc8FF0x7y14E, "_ZN3ccc8FF0x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y14C1Ev();
extern void _ZN3ccc8FF0x7y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y14E[] = {
  NSPAIR(_ZN3ccc8FF0x7y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x7y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x7y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y14E[] = {
  {&(_ZTVN3ccc8FF0x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y14E[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y14E = {  "_ZN3ccc8FF0x7y14E", // class name
  bases__ZN3ccc8FF0x7y14E, 2,
  &(vtc__ZN3ccc8FF0x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x7y15  : virtual ::ccc::EE0x7 {
  ~FF0x7y15(); // tgen
  FF0x7y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x7y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2}}
}
namespace ccc { 
ccc::FF0x7y15 ::~FF0x7y15(){ note_dtor("_ZN3ccc8FF0x7y15E", this);} // tgen
ccc::FF0x7y15 ::FF0x7y15(){ note_ctor("_ZN3ccc8FF0x7y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x7y15E, buf);
    ::ccc::FF0x7y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x7y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y15E");
    check_base_class_offset(lv, (::ccc::EE0x7*), 0, "_ZN3ccc8FF0x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x7y15E);
    dp->::ccc::FF0x7y15::~FF0x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x7y15E(Test__ZN3ccc8FF0x7y15E, "_ZN3ccc8FF0x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x7y15C1Ev();
extern void _ZN3ccc8FF0x7y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x7y15E[] = {
  NSPAIR(_ZN3ccc8FF0x7y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x7E[];
static Base_Class bases__ZN3ccc8FF0x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x7y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv)();
extern void _ZN3ccc5EE0x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv)();
extern void _ZN3ccc5EE0x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x7y15E[] = {
  {&(_ZTVN3ccc8FF0x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x7y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x7E__NS_8FF0x7y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x7y15E[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x73pqrEv,_ZTv0_n20_N3ccc5EE0x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x73abcEv,_ZTv0_n12_N3ccc5EE0x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x7y15E = {  "_ZN3ccc8FF0x7y15E", // class name
  bases__ZN3ccc8FF0x7y15E, 2,
  &(vtc__ZN3ccc8FF0x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x7y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x7y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x7y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x7y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y0  : virtual ::ccc::EE0x8 {
  virtual void  abc(); // _ZN3ccc7FF0x8y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y03pqrEv
  ~FF0x8y0(); // tgen
  FF0x8y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y03abcEv");}
void  ccc::FF0x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y03efgEv");}
void  ccc::FF0x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y03pqrEv");}
ccc::FF0x8y0 ::~FF0x8y0(){ note_dtor("_ZN3ccc7FF0x8y0E", this);} // tgen
ccc::FF0x8y0 ::FF0x8y0(){ note_ctor("_ZN3ccc7FF0x8y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y0E, buf);
    ::ccc::FF0x8y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y0E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y0E);
    dp->::ccc::FF0x8y0::~FF0x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y0E(Test__ZN3ccc7FF0x8y0E, "_ZN3ccc7FF0x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y0C1Ev();
extern void _ZN3ccc7FF0x8y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y0E[] = {
  NSPAIR(_ZN3ccc7FF0x8y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y0E[];
extern void _ZN3ccc7FF0x8y03abcEv();
extern void _ZN3ccc7FF0x8y03efgEv();
extern void _ZN3ccc7FF0x8y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y0E[] = {
  {&(_ZTVN3ccc7FF0x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y0E[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y0E = {  "_ZN3ccc7FF0x8y0E", // class name
  bases__ZN3ccc7FF0x8y0E, 2,
  &(vtc__ZN3ccc7FF0x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y1  : virtual ::ccc::EE0x8 {
  virtual void  abc(); // _ZN3ccc7FF0x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x8y13efgEv
  ~FF0x8y1(); // tgen
  FF0x8y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y13abcEv");}
void  ccc::FF0x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y13pqrEv");}
void  ccc::FF0x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y13efgEv");}
ccc::FF0x8y1 ::~FF0x8y1(){ note_dtor("_ZN3ccc7FF0x8y1E", this);} // tgen
ccc::FF0x8y1 ::FF0x8y1(){ note_ctor("_ZN3ccc7FF0x8y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y1E, buf);
    ::ccc::FF0x8y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y1E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y1E);
    dp->::ccc::FF0x8y1::~FF0x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y1E(Test__ZN3ccc7FF0x8y1E, "_ZN3ccc7FF0x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y1C1Ev();
extern void _ZN3ccc7FF0x8y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y1E[] = {
  NSPAIR(_ZN3ccc7FF0x8y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y1E[];
extern void _ZN3ccc7FF0x8y13abcEv();
extern void _ZN3ccc7FF0x8y13efgEv();
extern void _ZN3ccc7FF0x8y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y1E[] = {
  {&(_ZTVN3ccc7FF0x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y1E[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y1E = {  "_ZN3ccc7FF0x8y1E", // class name
  bases__ZN3ccc7FF0x8y1E, 2,
  &(vtc__ZN3ccc7FF0x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y2  : virtual ::ccc::EE0x8 {
  virtual void  efg(); // _ZN3ccc7FF0x8y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y23pqrEv
  ~FF0x8y2(); // tgen
  FF0x8y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y23efgEv");}
void  ccc::FF0x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y23abcEv");}
void  ccc::FF0x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y23pqrEv");}
ccc::FF0x8y2 ::~FF0x8y2(){ note_dtor("_ZN3ccc7FF0x8y2E", this);} // tgen
ccc::FF0x8y2 ::FF0x8y2(){ note_ctor("_ZN3ccc7FF0x8y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y2E, buf);
    ::ccc::FF0x8y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y2E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y2E);
    dp->::ccc::FF0x8y2::~FF0x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y2E(Test__ZN3ccc7FF0x8y2E, "_ZN3ccc7FF0x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y2C1Ev();
extern void _ZN3ccc7FF0x8y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y2E[] = {
  NSPAIR(_ZN3ccc7FF0x8y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y2E[];
extern void _ZN3ccc7FF0x8y23abcEv();
extern void _ZN3ccc7FF0x8y23efgEv();
extern void _ZN3ccc7FF0x8y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y2E[] = {
  {&(_ZTVN3ccc7FF0x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y2E[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y2E = {  "_ZN3ccc7FF0x8y2E", // class name
  bases__ZN3ccc7FF0x8y2E, 2,
  &(vtc__ZN3ccc7FF0x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y3  : virtual ::ccc::EE0x8 {
  virtual void  efg(); // _ZN3ccc7FF0x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x8y33abcEv
  ~FF0x8y3(); // tgen
  FF0x8y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y33efgEv");}
void  ccc::FF0x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y33pqrEv");}
void  ccc::FF0x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y33abcEv");}
ccc::FF0x8y3 ::~FF0x8y3(){ note_dtor("_ZN3ccc7FF0x8y3E", this);} // tgen
ccc::FF0x8y3 ::FF0x8y3(){ note_ctor("_ZN3ccc7FF0x8y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y3E, buf);
    ::ccc::FF0x8y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y3E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y3E);
    dp->::ccc::FF0x8y3::~FF0x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y3E(Test__ZN3ccc7FF0x8y3E, "_ZN3ccc7FF0x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y3C1Ev();
extern void _ZN3ccc7FF0x8y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y3E[] = {
  NSPAIR(_ZN3ccc7FF0x8y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y3E[];
extern void _ZN3ccc7FF0x8y33abcEv();
extern void _ZN3ccc7FF0x8y33efgEv();
extern void _ZN3ccc7FF0x8y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y3E[] = {
  {&(_ZTVN3ccc7FF0x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y3E[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y3E = {  "_ZN3ccc7FF0x8y3E", // class name
  bases__ZN3ccc7FF0x8y3E, 2,
  &(vtc__ZN3ccc7FF0x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y4  : virtual ::ccc::EE0x8 {
  virtual void  pqr(); // _ZN3ccc7FF0x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x8y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x8y43efgEv
  ~FF0x8y4(); // tgen
  FF0x8y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y43pqrEv");}
void  ccc::FF0x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y43abcEv");}
void  ccc::FF0x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y43efgEv");}
ccc::FF0x8y4 ::~FF0x8y4(){ note_dtor("_ZN3ccc7FF0x8y4E", this);} // tgen
ccc::FF0x8y4 ::FF0x8y4(){ note_ctor("_ZN3ccc7FF0x8y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y4E, buf);
    ::ccc::FF0x8y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y4E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y4E);
    dp->::ccc::FF0x8y4::~FF0x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y4E(Test__ZN3ccc7FF0x8y4E, "_ZN3ccc7FF0x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y4C1Ev();
extern void _ZN3ccc7FF0x8y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y4E[] = {
  NSPAIR(_ZN3ccc7FF0x8y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y4E[];
extern void _ZN3ccc7FF0x8y43abcEv();
extern void _ZN3ccc7FF0x8y43efgEv();
extern void _ZN3ccc7FF0x8y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y4E[] = {
  {&(_ZTVN3ccc7FF0x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y4E[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y4E = {  "_ZN3ccc7FF0x8y4E", // class name
  bases__ZN3ccc7FF0x8y4E, 2,
  &(vtc__ZN3ccc7FF0x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y5  : virtual ::ccc::EE0x8 {
  virtual void  pqr(); // _ZN3ccc7FF0x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x8y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x8y53abcEv
  ~FF0x8y5(); // tgen
  FF0x8y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y53pqrEv");}
void  ccc::FF0x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y53efgEv");}
void  ccc::FF0x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y53abcEv");}
ccc::FF0x8y5 ::~FF0x8y5(){ note_dtor("_ZN3ccc7FF0x8y5E", this);} // tgen
ccc::FF0x8y5 ::FF0x8y5(){ note_ctor("_ZN3ccc7FF0x8y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y5E, buf);
    ::ccc::FF0x8y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y5E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y5E);
    dp->::ccc::FF0x8y5::~FF0x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y5E(Test__ZN3ccc7FF0x8y5E, "_ZN3ccc7FF0x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y5C1Ev();
extern void _ZN3ccc7FF0x8y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y5E[] = {
  NSPAIR(_ZN3ccc7FF0x8y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y5E[];
extern void _ZN3ccc7FF0x8y53abcEv();
extern void _ZN3ccc7FF0x8y53efgEv();
extern void _ZN3ccc7FF0x8y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y5E[] = {
  {&(_ZTVN3ccc7FF0x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y5E[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y5E = {  "_ZN3ccc7FF0x8y5E", // class name
  bases__ZN3ccc7FF0x8y5E, 2,
  &(vtc__ZN3ccc7FF0x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y6  : virtual ::ccc::EE0x8 {
  virtual void  abc(); // _ZN3ccc7FF0x8y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x8y63efgEv
  ~FF0x8y6(); // tgen
  FF0x8y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y63abcEv");}
void  ccc::FF0x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y63efgEv");}
ccc::FF0x8y6 ::~FF0x8y6(){ note_dtor("_ZN3ccc7FF0x8y6E", this);} // tgen
ccc::FF0x8y6 ::FF0x8y6(){ note_ctor("_ZN3ccc7FF0x8y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y6E, buf);
    ::ccc::FF0x8y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y6E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y6E);
    dp->::ccc::FF0x8y6::~FF0x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y6E(Test__ZN3ccc7FF0x8y6E, "_ZN3ccc7FF0x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y6C1Ev();
extern void _ZN3ccc7FF0x8y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y6E[] = {
  NSPAIR(_ZN3ccc7FF0x8y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y6E[];
extern void _ZN3ccc7FF0x8y63abcEv();
extern void _ZN3ccc7FF0x8y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y6E[] = {
  {&(_ZTVN3ccc7FF0x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y6E[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y6E = {  "_ZN3ccc7FF0x8y6E", // class name
  bases__ZN3ccc7FF0x8y6E, 2,
  &(vtc__ZN3ccc7FF0x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y7  : virtual ::ccc::EE0x8 {
  virtual void  abc(); // _ZN3ccc7FF0x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y73pqrEv
  ~FF0x8y7(); // tgen
  FF0x8y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y73abcEv");}
void  ccc::FF0x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y73pqrEv");}
ccc::FF0x8y7 ::~FF0x8y7(){ note_dtor("_ZN3ccc7FF0x8y7E", this);} // tgen
ccc::FF0x8y7 ::FF0x8y7(){ note_ctor("_ZN3ccc7FF0x8y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y7E, buf);
    ::ccc::FF0x8y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y7E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y7E);
    dp->::ccc::FF0x8y7::~FF0x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y7E(Test__ZN3ccc7FF0x8y7E, "_ZN3ccc7FF0x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y7C1Ev();
extern void _ZN3ccc7FF0x8y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y7E[] = {
  NSPAIR(_ZN3ccc7FF0x8y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y7E[];
extern void _ZN3ccc7FF0x8y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x8y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y7E[] = {
  {&(_ZTVN3ccc7FF0x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y7E[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y7E = {  "_ZN3ccc7FF0x8y7E", // class name
  bases__ZN3ccc7FF0x8y7E, 2,
  &(vtc__ZN3ccc7FF0x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y8  : virtual ::ccc::EE0x8 {
  virtual void  efg(); // _ZN3ccc7FF0x8y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x8y83abcEv
  ~FF0x8y8(); // tgen
  FF0x8y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y83efgEv");}
void  ccc::FF0x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x8y83abcEv");}
ccc::FF0x8y8 ::~FF0x8y8(){ note_dtor("_ZN3ccc7FF0x8y8E", this);} // tgen
ccc::FF0x8y8 ::FF0x8y8(){ note_ctor("_ZN3ccc7FF0x8y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y8E, buf);
    ::ccc::FF0x8y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y8E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y8E);
    dp->::ccc::FF0x8y8::~FF0x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y8E(Test__ZN3ccc7FF0x8y8E, "_ZN3ccc7FF0x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y8C1Ev();
extern void _ZN3ccc7FF0x8y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y8E[] = {
  NSPAIR(_ZN3ccc7FF0x8y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y8E[];
extern void _ZN3ccc7FF0x8y83abcEv();
extern void _ZN3ccc7FF0x8y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y8E[] = {
  {&(_ZTVN3ccc7FF0x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y8E[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y8E = {  "_ZN3ccc7FF0x8y8E", // class name
  bases__ZN3ccc7FF0x8y8E, 2,
  &(vtc__ZN3ccc7FF0x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y9  : virtual ::ccc::EE0x8 {
  virtual void  efg(); // _ZN3ccc7FF0x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x8y93pqrEv
  ~FF0x8y9(); // tgen
  FF0x8y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x8y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x8y93efgEv");}
void  ccc::FF0x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x8y93pqrEv");}
ccc::FF0x8y9 ::~FF0x8y9(){ note_dtor("_ZN3ccc7FF0x8y9E", this);} // tgen
ccc::FF0x8y9 ::FF0x8y9(){ note_ctor("_ZN3ccc7FF0x8y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x8y9E, buf);
    ::ccc::FF0x8y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x8y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y9E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc7FF0x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x8y9E);
    dp->::ccc::FF0x8y9::~FF0x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x8y9E(Test__ZN3ccc7FF0x8y9E, "_ZN3ccc7FF0x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x8y9C1Ev();
extern void _ZN3ccc7FF0x8y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x8y9E[] = {
  NSPAIR(_ZN3ccc7FF0x8y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc7FF0x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void _ZN3ccc7FF0x8y93efgEv();
extern void _ZN3ccc7FF0x8y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x8y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x8y9E[] = {
  {&(_ZTVN3ccc7FF0x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x8y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_7FF0x8y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x8y9E[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x8y9E = {  "_ZN3ccc7FF0x8y9E", // class name
  bases__ZN3ccc7FF0x8y9E, 2,
  &(vtc__ZN3ccc7FF0x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x8y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x8y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x8y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x8y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y10  : virtual ::ccc::EE0x8 {
  virtual void  pqr(); // _ZN3ccc8FF0x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x8y103abcEv
  ~FF0x8y10(); // tgen
  FF0x8y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x8y103pqrEv");}
void  ccc::FF0x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x8y103abcEv");}
ccc::FF0x8y10 ::~FF0x8y10(){ note_dtor("_ZN3ccc8FF0x8y10E", this);} // tgen
ccc::FF0x8y10 ::FF0x8y10(){ note_ctor("_ZN3ccc8FF0x8y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y10E, buf);
    ::ccc::FF0x8y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y10E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y10E);
    dp->::ccc::FF0x8y10::~FF0x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y10E(Test__ZN3ccc8FF0x8y10E, "_ZN3ccc8FF0x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y10C1Ev();
extern void _ZN3ccc8FF0x8y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y10E[] = {
  NSPAIR(_ZN3ccc8FF0x8y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y10E[];
extern void _ZN3ccc8FF0x8y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x8y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y10E[] = {
  {&(_ZTVN3ccc8FF0x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y10E[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y10E = {  "_ZN3ccc8FF0x8y10E", // class name
  bases__ZN3ccc8FF0x8y10E, 2,
  &(vtc__ZN3ccc8FF0x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names139,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y11  : virtual ::ccc::EE0x8 {
  virtual void  pqr(); // _ZN3ccc8FF0x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x8y113efgEv
  ~FF0x8y11(); // tgen
  FF0x8y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x8y113pqrEv");}
void  ccc::FF0x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x8y113efgEv");}
ccc::FF0x8y11 ::~FF0x8y11(){ note_dtor("_ZN3ccc8FF0x8y11E", this);} // tgen
ccc::FF0x8y11 ::FF0x8y11(){ note_ctor("_ZN3ccc8FF0x8y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y11E, buf);
    ::ccc::FF0x8y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y11E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y11E);
    dp->::ccc::FF0x8y11::~FF0x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y11E(Test__ZN3ccc8FF0x8y11E, "_ZN3ccc8FF0x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y11C1Ev();
extern void _ZN3ccc8FF0x8y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y11E[] = {
  NSPAIR(_ZN3ccc8FF0x8y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x8y113efgEv();
extern void _ZN3ccc8FF0x8y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y11E[] = {
  {&(_ZTVN3ccc8FF0x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y11E[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y11E = {  "_ZN3ccc8FF0x8y11E", // class name
  bases__ZN3ccc8FF0x8y11E, 2,
  &(vtc__ZN3ccc8FF0x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names140,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y12  : virtual ::ccc::EE0x8 {
  virtual void  abc(); // _ZN3ccc8FF0x8y123abcEv
  ~FF0x8y12(); // tgen
  FF0x8y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x8y123abcEv");}
ccc::FF0x8y12 ::~FF0x8y12(){ note_dtor("_ZN3ccc8FF0x8y12E", this);} // tgen
ccc::FF0x8y12 ::FF0x8y12(){ note_ctor("_ZN3ccc8FF0x8y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y12E, buf);
    ::ccc::FF0x8y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y12E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y12E);
    dp->::ccc::FF0x8y12::~FF0x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y12E(Test__ZN3ccc8FF0x8y12E, "_ZN3ccc8FF0x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y12C1Ev();
extern void _ZN3ccc8FF0x8y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y12E[] = {
  NSPAIR(_ZN3ccc8FF0x8y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y12E[];
extern void _ZN3ccc8FF0x8y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y12E[] = {
  {&(_ZTVN3ccc8FF0x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y12E[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y12E = {  "_ZN3ccc8FF0x8y12E", // class name
  bases__ZN3ccc8FF0x8y12E, 2,
  &(vtc__ZN3ccc8FF0x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names141,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y13  : virtual ::ccc::EE0x8 {
  virtual void  efg(); // _ZN3ccc8FF0x8y133efgEv
  ~FF0x8y13(); // tgen
  FF0x8y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x8y133efgEv");}
ccc::FF0x8y13 ::~FF0x8y13(){ note_dtor("_ZN3ccc8FF0x8y13E", this);} // tgen
ccc::FF0x8y13 ::FF0x8y13(){ note_ctor("_ZN3ccc8FF0x8y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y13E, buf);
    ::ccc::FF0x8y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y13E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y13E);
    dp->::ccc::FF0x8y13::~FF0x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y13E(Test__ZN3ccc8FF0x8y13E, "_ZN3ccc8FF0x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y13C1Ev();
extern void _ZN3ccc8FF0x8y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y13E[] = {
  NSPAIR(_ZN3ccc8FF0x8y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x8y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y13E[] = {
  {&(_ZTVN3ccc8FF0x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y13E[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y13E = {  "_ZN3ccc8FF0x8y13E", // class name
  bases__ZN3ccc8FF0x8y13E, 2,
  &(vtc__ZN3ccc8FF0x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names142,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y14  : virtual ::ccc::EE0x8 {
  virtual void  pqr(); // _ZN3ccc8FF0x8y143pqrEv
  ~FF0x8y14(); // tgen
  FF0x8y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x8y143pqrEv");}
ccc::FF0x8y14 ::~FF0x8y14(){ note_dtor("_ZN3ccc8FF0x8y14E", this);} // tgen
ccc::FF0x8y14 ::FF0x8y14(){ note_ctor("_ZN3ccc8FF0x8y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y14E, buf);
    ::ccc::FF0x8y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y14E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y14E);
    dp->::ccc::FF0x8y14::~FF0x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y14E(Test__ZN3ccc8FF0x8y14E, "_ZN3ccc8FF0x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y14C1Ev();
extern void _ZN3ccc8FF0x8y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y14E[] = {
  NSPAIR(_ZN3ccc8FF0x8y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x8y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x8y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y14E[] = {
  {&(_ZTVN3ccc8FF0x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y14E[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y14E = {  "_ZN3ccc8FF0x8y14E", // class name
  bases__ZN3ccc8FF0x8y14E, 2,
  &(vtc__ZN3ccc8FF0x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x8y15  : virtual ::ccc::EE0x8 {
  ~FF0x8y15(); // tgen
  FF0x8y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x8y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2}}
}
namespace ccc { 
ccc::FF0x8y15 ::~FF0x8y15(){ note_dtor("_ZN3ccc8FF0x8y15E", this);} // tgen
ccc::FF0x8y15 ::FF0x8y15(){ note_ctor("_ZN3ccc8FF0x8y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x8y15E, buf);
    ::ccc::FF0x8y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x8y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y15E");
    check_base_class_offset(lv, (::ccc::EE0x8*), 0, "_ZN3ccc8FF0x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x8y15E);
    dp->::ccc::FF0x8y15::~FF0x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x8y15E(Test__ZN3ccc8FF0x8y15E, "_ZN3ccc8FF0x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x8y15C1Ev();
extern void _ZN3ccc8FF0x8y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x8y15E[] = {
  NSPAIR(_ZN3ccc8FF0x8y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x8E[];
static Base_Class bases__ZN3ccc8FF0x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x8y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv)();
extern void _ZN3ccc5EE0x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv)();
extern void _ZN3ccc5EE0x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x8y15E[] = {
  {&(_ZTVN3ccc8FF0x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x8y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x8E__NS_8FF0x8y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x8y15E[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x83efgEv,_ZTv0_n16_N3ccc5EE0x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE0x83abcEv,_ZTv0_n12_N3ccc5EE0x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x8y15E = {  "_ZN3ccc8FF0x8y15E", // class name
  bases__ZN3ccc8FF0x8y15E, 2,
  &(vtc__ZN3ccc8FF0x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x8y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x8y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x8y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x8y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y0  : virtual ::ccc::EE0x9 {
  virtual void  abc(); // _ZN3ccc7FF0x9y03abcEv
  virtual void  efg(); // _ZN3ccc7FF0x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y03pqrEv
  ~FF0x9y0(); // tgen
  FF0x9y0(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y03abcEv");}
void  ccc::FF0x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y03efgEv");}
void  ccc::FF0x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y03pqrEv");}
ccc::FF0x9y0 ::~FF0x9y0(){ note_dtor("_ZN3ccc7FF0x9y0E", this);} // tgen
ccc::FF0x9y0 ::FF0x9y0(){ note_ctor("_ZN3ccc7FF0x9y0E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y0E, buf);
    ::ccc::FF0x9y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y0E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y0E);
    dp->::ccc::FF0x9y0::~FF0x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y0E(Test__ZN3ccc7FF0x9y0E, "_ZN3ccc7FF0x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y0C1Ev();
extern void _ZN3ccc7FF0x9y0D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y0E[] = {
  NSPAIR(_ZN3ccc7FF0x9y0C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y0E[];
extern void _ZN3ccc7FF0x9y03abcEv();
extern void _ZN3ccc7FF0x9y03efgEv();
extern void _ZN3ccc7FF0x9y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y0E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y0E[] = {
  {&(_ZTVN3ccc7FF0x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y0E[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y0E = {  "_ZN3ccc7FF0x9y0E", // class name
  bases__ZN3ccc7FF0x9y0E, 2,
  &(vtc__ZN3ccc7FF0x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y1  : virtual ::ccc::EE0x9 {
  virtual void  abc(); // _ZN3ccc7FF0x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x9y13efgEv
  ~FF0x9y1(); // tgen
  FF0x9y1(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y13abcEv");}
void  ccc::FF0x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y13pqrEv");}
void  ccc::FF0x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y13efgEv");}
ccc::FF0x9y1 ::~FF0x9y1(){ note_dtor("_ZN3ccc7FF0x9y1E", this);} // tgen
ccc::FF0x9y1 ::FF0x9y1(){ note_ctor("_ZN3ccc7FF0x9y1E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y1E, buf);
    ::ccc::FF0x9y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y1E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y1E);
    dp->::ccc::FF0x9y1::~FF0x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y1E(Test__ZN3ccc7FF0x9y1E, "_ZN3ccc7FF0x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y1C1Ev();
extern void _ZN3ccc7FF0x9y1D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y1E[] = {
  NSPAIR(_ZN3ccc7FF0x9y1C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y1E[];
extern void _ZN3ccc7FF0x9y13abcEv();
extern void _ZN3ccc7FF0x9y13efgEv();
extern void _ZN3ccc7FF0x9y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y1E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y1E[] = {
  {&(_ZTVN3ccc7FF0x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y1E[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y1E = {  "_ZN3ccc7FF0x9y1E", // class name
  bases__ZN3ccc7FF0x9y1E, 2,
  &(vtc__ZN3ccc7FF0x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y2  : virtual ::ccc::EE0x9 {
  virtual void  efg(); // _ZN3ccc7FF0x9y23efgEv
  virtual void  abc(); // _ZN3ccc7FF0x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y23pqrEv
  ~FF0x9y2(); // tgen
  FF0x9y2(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y23efgEv");}
void  ccc::FF0x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y23abcEv");}
void  ccc::FF0x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y23pqrEv");}
ccc::FF0x9y2 ::~FF0x9y2(){ note_dtor("_ZN3ccc7FF0x9y2E", this);} // tgen
ccc::FF0x9y2 ::FF0x9y2(){ note_ctor("_ZN3ccc7FF0x9y2E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y2E, buf);
    ::ccc::FF0x9y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y2E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y2E);
    dp->::ccc::FF0x9y2::~FF0x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y2E(Test__ZN3ccc7FF0x9y2E, "_ZN3ccc7FF0x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y2C1Ev();
extern void _ZN3ccc7FF0x9y2D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y2E[] = {
  NSPAIR(_ZN3ccc7FF0x9y2C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y2E[];
extern void _ZN3ccc7FF0x9y23abcEv();
extern void _ZN3ccc7FF0x9y23efgEv();
extern void _ZN3ccc7FF0x9y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y2E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y2E[] = {
  {&(_ZTVN3ccc7FF0x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y2E[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y2E = {  "_ZN3ccc7FF0x9y2E", // class name
  bases__ZN3ccc7FF0x9y2E, 2,
  &(vtc__ZN3ccc7FF0x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y3  : virtual ::ccc::EE0x9 {
  virtual void  efg(); // _ZN3ccc7FF0x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x9y33abcEv
  ~FF0x9y3(); // tgen
  FF0x9y3(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y33efgEv");}
void  ccc::FF0x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y33pqrEv");}
void  ccc::FF0x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y33abcEv");}
ccc::FF0x9y3 ::~FF0x9y3(){ note_dtor("_ZN3ccc7FF0x9y3E", this);} // tgen
ccc::FF0x9y3 ::FF0x9y3(){ note_ctor("_ZN3ccc7FF0x9y3E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y3E, buf);
    ::ccc::FF0x9y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y3E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y3E);
    dp->::ccc::FF0x9y3::~FF0x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y3E(Test__ZN3ccc7FF0x9y3E, "_ZN3ccc7FF0x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y3C1Ev();
extern void _ZN3ccc7FF0x9y3D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y3E[] = {
  NSPAIR(_ZN3ccc7FF0x9y3C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y3E[];
extern void _ZN3ccc7FF0x9y33abcEv();
extern void _ZN3ccc7FF0x9y33efgEv();
extern void _ZN3ccc7FF0x9y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y3E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y3E[] = {
  {&(_ZTVN3ccc7FF0x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y3E[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y3E = {  "_ZN3ccc7FF0x9y3E", // class name
  bases__ZN3ccc7FF0x9y3E, 2,
  &(vtc__ZN3ccc7FF0x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y4  : virtual ::ccc::EE0x9 {
  virtual void  pqr(); // _ZN3ccc7FF0x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF0x9y43abcEv
  virtual void  efg(); // _ZN3ccc7FF0x9y43efgEv
  ~FF0x9y4(); // tgen
  FF0x9y4(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y43pqrEv");}
void  ccc::FF0x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y43abcEv");}
void  ccc::FF0x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y43efgEv");}
ccc::FF0x9y4 ::~FF0x9y4(){ note_dtor("_ZN3ccc7FF0x9y4E", this);} // tgen
ccc::FF0x9y4 ::FF0x9y4(){ note_ctor("_ZN3ccc7FF0x9y4E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y4E, buf);
    ::ccc::FF0x9y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y4E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y4E);
    dp->::ccc::FF0x9y4::~FF0x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y4E(Test__ZN3ccc7FF0x9y4E, "_ZN3ccc7FF0x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y4C1Ev();
extern void _ZN3ccc7FF0x9y4D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y4E[] = {
  NSPAIR(_ZN3ccc7FF0x9y4C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y4E[];
extern void _ZN3ccc7FF0x9y43abcEv();
extern void _ZN3ccc7FF0x9y43efgEv();
extern void _ZN3ccc7FF0x9y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y4E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y4E[] = {
  {&(_ZTVN3ccc7FF0x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y4E[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y4E = {  "_ZN3ccc7FF0x9y4E", // class name
  bases__ZN3ccc7FF0x9y4E, 2,
  &(vtc__ZN3ccc7FF0x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y5  : virtual ::ccc::EE0x9 {
  virtual void  pqr(); // _ZN3ccc7FF0x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF0x9y53efgEv
  virtual void  abc(); // _ZN3ccc7FF0x9y53abcEv
  ~FF0x9y5(); // tgen
  FF0x9y5(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y53pqrEv");}
void  ccc::FF0x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y53efgEv");}
void  ccc::FF0x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y53abcEv");}
ccc::FF0x9y5 ::~FF0x9y5(){ note_dtor("_ZN3ccc7FF0x9y5E", this);} // tgen
ccc::FF0x9y5 ::FF0x9y5(){ note_ctor("_ZN3ccc7FF0x9y5E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y5E, buf);
    ::ccc::FF0x9y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y5E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y5E);
    dp->::ccc::FF0x9y5::~FF0x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y5E(Test__ZN3ccc7FF0x9y5E, "_ZN3ccc7FF0x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y5C1Ev();
extern void _ZN3ccc7FF0x9y5D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y5E[] = {
  NSPAIR(_ZN3ccc7FF0x9y5C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y5E[];
extern void _ZN3ccc7FF0x9y53abcEv();
extern void _ZN3ccc7FF0x9y53efgEv();
extern void _ZN3ccc7FF0x9y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y5E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y5E[] = {
  {&(_ZTVN3ccc7FF0x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y5E[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y5E = {  "_ZN3ccc7FF0x9y5E", // class name
  bases__ZN3ccc7FF0x9y5E, 2,
  &(vtc__ZN3ccc7FF0x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y6  : virtual ::ccc::EE0x9 {
  virtual void  abc(); // _ZN3ccc7FF0x9y63abcEv
  virtual void  efg(); // _ZN3ccc7FF0x9y63efgEv
  ~FF0x9y6(); // tgen
  FF0x9y6(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y63abcEv");}
void  ccc::FF0x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y63efgEv");}
ccc::FF0x9y6 ::~FF0x9y6(){ note_dtor("_ZN3ccc7FF0x9y6E", this);} // tgen
ccc::FF0x9y6 ::FF0x9y6(){ note_ctor("_ZN3ccc7FF0x9y6E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y6E, buf);
    ::ccc::FF0x9y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y6E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y6E);
    dp->::ccc::FF0x9y6::~FF0x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y6E(Test__ZN3ccc7FF0x9y6E, "_ZN3ccc7FF0x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y6C1Ev();
extern void _ZN3ccc7FF0x9y6D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y6E[] = {
  NSPAIR(_ZN3ccc7FF0x9y6C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y6E[];
extern void _ZN3ccc7FF0x9y63abcEv();
extern void _ZN3ccc7FF0x9y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y6E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y6E[] = {
  {&(_ZTVN3ccc7FF0x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y6E[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y6E = {  "_ZN3ccc7FF0x9y6E", // class name
  bases__ZN3ccc7FF0x9y6E, 2,
  &(vtc__ZN3ccc7FF0x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y7  : virtual ::ccc::EE0x9 {
  virtual void  abc(); // _ZN3ccc7FF0x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y73pqrEv
  ~FF0x9y7(); // tgen
  FF0x9y7(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y73abcEv");}
void  ccc::FF0x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y73pqrEv");}
ccc::FF0x9y7 ::~FF0x9y7(){ note_dtor("_ZN3ccc7FF0x9y7E", this);} // tgen
ccc::FF0x9y7 ::FF0x9y7(){ note_ctor("_ZN3ccc7FF0x9y7E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y7E, buf);
    ::ccc::FF0x9y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y7E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y7E);
    dp->::ccc::FF0x9y7::~FF0x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y7E(Test__ZN3ccc7FF0x9y7E, "_ZN3ccc7FF0x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y7C1Ev();
extern void _ZN3ccc7FF0x9y7D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y7E[] = {
  NSPAIR(_ZN3ccc7FF0x9y7C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y7E[];
extern void _ZN3ccc7FF0x9y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void _ZN3ccc7FF0x9y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y7E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y7E[] = {
  {&(_ZTVN3ccc7FF0x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y7E[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y7E = {  "_ZN3ccc7FF0x9y7E", // class name
  bases__ZN3ccc7FF0x9y7E, 2,
  &(vtc__ZN3ccc7FF0x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y8  : virtual ::ccc::EE0x9 {
  virtual void  efg(); // _ZN3ccc7FF0x9y83efgEv
  virtual void  abc(); // _ZN3ccc7FF0x9y83abcEv
  ~FF0x9y8(); // tgen
  FF0x9y8(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y83efgEv");}
void  ccc::FF0x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF0x9y83abcEv");}
ccc::FF0x9y8 ::~FF0x9y8(){ note_dtor("_ZN3ccc7FF0x9y8E", this);} // tgen
ccc::FF0x9y8 ::FF0x9y8(){ note_ctor("_ZN3ccc7FF0x9y8E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y8E, buf);
    ::ccc::FF0x9y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y8E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y8E);
    dp->::ccc::FF0x9y8::~FF0x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y8E(Test__ZN3ccc7FF0x9y8E, "_ZN3ccc7FF0x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y8C1Ev();
extern void _ZN3ccc7FF0x9y8D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y8E[] = {
  NSPAIR(_ZN3ccc7FF0x9y8C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y8E[];
extern void _ZN3ccc7FF0x9y83abcEv();
extern void _ZN3ccc7FF0x9y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y8E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y8E[] = {
  {&(_ZTVN3ccc7FF0x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y8E[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y8E = {  "_ZN3ccc7FF0x9y8E", // class name
  bases__ZN3ccc7FF0x9y8E, 2,
  &(vtc__ZN3ccc7FF0x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y9  : virtual ::ccc::EE0x9 {
  virtual void  efg(); // _ZN3ccc7FF0x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF0x9y93pqrEv
  ~FF0x9y9(); // tgen
  FF0x9y9(); // tgen
};
//SIG(1 _ZN3ccc7FF0x9y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF0x9y93efgEv");}
void  ccc::FF0x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF0x9y93pqrEv");}
ccc::FF0x9y9 ::~FF0x9y9(){ note_dtor("_ZN3ccc7FF0x9y9E", this);} // tgen
ccc::FF0x9y9 ::FF0x9y9(){ note_ctor("_ZN3ccc7FF0x9y9E", this);} // tgen
}
static void Test__ZN3ccc7FF0x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF0x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF0x9y9E, buf);
    ::ccc::FF0x9y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF0x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF0x9y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y9E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc7FF0x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF0x9y9E);
    dp->::ccc::FF0x9y9::~FF0x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF0x9y9E(Test__ZN3ccc7FF0x9y9E, "_ZN3ccc7FF0x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF0x9y9C1Ev();
extern void _ZN3ccc7FF0x9y9D1Ev();
Name_Map name_map__ZN3ccc7FF0x9y9E[] = {
  NSPAIR(_ZN3ccc7FF0x9y9C1Ev),
  NSPAIR(_ZN3ccc7FF0x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc7FF0x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7FF0x9y93efgEv();
extern void _ZN3ccc7FF0x9y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF0x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF0x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF0x9y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF0x9y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF0x9y9E[] = {
  {&(_ZTVN3ccc7FF0x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF0x9y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_7FF0x9y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF0x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF0x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF0x9y9E[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF0x9y9E = {  "_ZN3ccc7FF0x9y9E", // class name
  bases__ZN3ccc7FF0x9y9E, 2,
  &(vtc__ZN3ccc7FF0x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF0x9y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF0x9y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF0x9y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF0x9y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y10  : virtual ::ccc::EE0x9 {
  virtual void  pqr(); // _ZN3ccc8FF0x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x9y103abcEv
  ~FF0x9y10(); // tgen
  FF0x9y10(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x9y103pqrEv");}
void  ccc::FF0x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x9y103abcEv");}
ccc::FF0x9y10 ::~FF0x9y10(){ note_dtor("_ZN3ccc8FF0x9y10E", this);} // tgen
ccc::FF0x9y10 ::FF0x9y10(){ note_ctor("_ZN3ccc8FF0x9y10E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y10E, buf);
    ::ccc::FF0x9y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y10E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y10E);
    dp->::ccc::FF0x9y10::~FF0x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y10E(Test__ZN3ccc8FF0x9y10E, "_ZN3ccc8FF0x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y10C1Ev();
extern void _ZN3ccc8FF0x9y10D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y10E[] = {
  NSPAIR(_ZN3ccc8FF0x9y10C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y10E[];
extern void _ZN3ccc8FF0x9y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x9y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y10E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y10E[] = {
  {&(_ZTVN3ccc8FF0x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y10E[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y10E = {  "_ZN3ccc8FF0x9y10E", // class name
  bases__ZN3ccc8FF0x9y10E, 2,
  &(vtc__ZN3ccc8FF0x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y11  : virtual ::ccc::EE0x9 {
  virtual void  pqr(); // _ZN3ccc8FF0x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x9y113efgEv
  ~FF0x9y11(); // tgen
  FF0x9y11(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x9y113pqrEv");}
void  ccc::FF0x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x9y113efgEv");}
ccc::FF0x9y11 ::~FF0x9y11(){ note_dtor("_ZN3ccc8FF0x9y11E", this);} // tgen
ccc::FF0x9y11 ::FF0x9y11(){ note_ctor("_ZN3ccc8FF0x9y11E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y11E, buf);
    ::ccc::FF0x9y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y11E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y11E);
    dp->::ccc::FF0x9y11::~FF0x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y11E(Test__ZN3ccc8FF0x9y11E, "_ZN3ccc8FF0x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y11C1Ev();
extern void _ZN3ccc8FF0x9y11D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y11E[] = {
  NSPAIR(_ZN3ccc8FF0x9y11C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x9y113efgEv();
extern void _ZN3ccc8FF0x9y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y11E[] = {
  {&(_ZTVN3ccc8FF0x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y11E[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y11E = {  "_ZN3ccc8FF0x9y11E", // class name
  bases__ZN3ccc8FF0x9y11E, 2,
  &(vtc__ZN3ccc8FF0x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y12  : virtual ::ccc::EE0x9 {
  virtual void  abc(); // _ZN3ccc8FF0x9y123abcEv
  ~FF0x9y12(); // tgen
  FF0x9y12(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x9y123abcEv");}
ccc::FF0x9y12 ::~FF0x9y12(){ note_dtor("_ZN3ccc8FF0x9y12E", this);} // tgen
ccc::FF0x9y12 ::FF0x9y12(){ note_ctor("_ZN3ccc8FF0x9y12E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y12E, buf);
    ::ccc::FF0x9y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y12E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y12E);
    dp->::ccc::FF0x9y12::~FF0x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y12E(Test__ZN3ccc8FF0x9y12E, "_ZN3ccc8FF0x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y12C1Ev();
extern void _ZN3ccc8FF0x9y12D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y12E[] = {
  NSPAIR(_ZN3ccc8FF0x9y12C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y12E[];
extern void _ZN3ccc8FF0x9y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y12E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y12E[] = {
  {&(_ZTVN3ccc8FF0x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y12E[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y12E = {  "_ZN3ccc8FF0x9y12E", // class name
  bases__ZN3ccc8FF0x9y12E, 2,
  &(vtc__ZN3ccc8FF0x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y13  : virtual ::ccc::EE0x9 {
  virtual void  efg(); // _ZN3ccc8FF0x9y133efgEv
  ~FF0x9y13(); // tgen
  FF0x9y13(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x9y133efgEv");}
ccc::FF0x9y13 ::~FF0x9y13(){ note_dtor("_ZN3ccc8FF0x9y13E", this);} // tgen
ccc::FF0x9y13 ::FF0x9y13(){ note_ctor("_ZN3ccc8FF0x9y13E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y13E, buf);
    ::ccc::FF0x9y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y13E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y13E);
    dp->::ccc::FF0x9y13::~FF0x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y13E(Test__ZN3ccc8FF0x9y13E, "_ZN3ccc8FF0x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y13C1Ev();
extern void _ZN3ccc8FF0x9y13D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y13E[] = {
  NSPAIR(_ZN3ccc8FF0x9y13C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x9y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y13E[] = {
  {&(_ZTVN3ccc8FF0x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y13E[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y13E = {  "_ZN3ccc8FF0x9y13E", // class name
  bases__ZN3ccc8FF0x9y13E, 2,
  &(vtc__ZN3ccc8FF0x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y14  : virtual ::ccc::EE0x9 {
  virtual void  pqr(); // _ZN3ccc8FF0x9y143pqrEv
  ~FF0x9y14(); // tgen
  FF0x9y14(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x9y143pqrEv");}
ccc::FF0x9y14 ::~FF0x9y14(){ note_dtor("_ZN3ccc8FF0x9y14E", this);} // tgen
ccc::FF0x9y14 ::FF0x9y14(){ note_ctor("_ZN3ccc8FF0x9y14E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y14E, buf);
    ::ccc::FF0x9y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y14E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y14E);
    dp->::ccc::FF0x9y14::~FF0x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y14E(Test__ZN3ccc8FF0x9y14E, "_ZN3ccc8FF0x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y14C1Ev();
extern void _ZN3ccc8FF0x9y14D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y14E[] = {
  NSPAIR(_ZN3ccc8FF0x9y14C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x9y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x9y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y14E[] = {
  {&(_ZTVN3ccc8FF0x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y14E[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y14E = {  "_ZN3ccc8FF0x9y14E", // class name
  bases__ZN3ccc8FF0x9y14E, 2,
  &(vtc__ZN3ccc8FF0x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x9y15  : virtual ::ccc::EE0x9 {
  ~FF0x9y15(); // tgen
  FF0x9y15(); // tgen
};
//SIG(1 _ZN3ccc8FF0x9y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2}}
}
namespace ccc { 
ccc::FF0x9y15 ::~FF0x9y15(){ note_dtor("_ZN3ccc8FF0x9y15E", this);} // tgen
ccc::FF0x9y15 ::FF0x9y15(){ note_ctor("_ZN3ccc8FF0x9y15E", this);} // tgen
}
static void Test__ZN3ccc8FF0x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x9y15E, buf);
    ::ccc::FF0x9y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x9y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y15E");
    check_base_class_offset(lv, (::ccc::EE0x9*), 0, "_ZN3ccc8FF0x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x9y15E);
    dp->::ccc::FF0x9y15::~FF0x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x9y15E(Test__ZN3ccc8FF0x9y15E, "_ZN3ccc8FF0x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x9y15C1Ev();
extern void _ZN3ccc8FF0x9y15D1Ev();
Name_Map name_map__ZN3ccc8FF0x9y15E[] = {
  NSPAIR(_ZN3ccc8FF0x9y15C1Ev),
  NSPAIR(_ZN3ccc8FF0x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc5EE0x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE0x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE0x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE0x9E[];
static Base_Class bases__ZN3ccc8FF0x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE0x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x9y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv)();
extern void _ZN3ccc5EE0x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv)();
extern void _ZN3ccc5EE0x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE0x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x9y15E[] = {
  {&(_ZTVN3ccc8FF0x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x9y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE0x9E__NS_8FF0x9y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x9y15E[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE0x93pqrEv,_ZTv0_n20_N3ccc5EE0x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE0x93efgEv,_ZTv0_n16_N3ccc5EE0x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE0x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x9y15E = {  "_ZN3ccc8FF0x9y15E", // class name
  bases__ZN3ccc8FF0x9y15E, 2,
  &(vtc__ZN3ccc8FF0x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x9y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x9y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x9y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x9y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y0  : virtual ::ccc::EE0x10 {
  virtual void  abc(); // _ZN3ccc8FF0x10y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y03pqrEv
  ~FF0x10y0(); // tgen
  FF0x10y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y03abcEv");}
void  ccc::FF0x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y03efgEv");}
void  ccc::FF0x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y03pqrEv");}
ccc::FF0x10y0 ::~FF0x10y0(){ note_dtor("_ZN3ccc8FF0x10y0E", this);} // tgen
ccc::FF0x10y0 ::FF0x10y0(){ note_ctor("_ZN3ccc8FF0x10y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y0E, buf);
    ::ccc::FF0x10y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y0E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y0E);
    dp->::ccc::FF0x10y0::~FF0x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y0E(Test__ZN3ccc8FF0x10y0E, "_ZN3ccc8FF0x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y0C1Ev();
extern void _ZN3ccc8FF0x10y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y0E[] = {
  NSPAIR(_ZN3ccc8FF0x10y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y0E[];
extern void _ZN3ccc8FF0x10y03abcEv();
extern void _ZN3ccc8FF0x10y03efgEv();
extern void _ZN3ccc8FF0x10y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y0E[] = {
  {&(_ZTVN3ccc8FF0x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y0E[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y0E = {  "_ZN3ccc8FF0x10y0E", // class name
  bases__ZN3ccc8FF0x10y0E, 2,
  &(vtc__ZN3ccc8FF0x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y1  : virtual ::ccc::EE0x10 {
  virtual void  abc(); // _ZN3ccc8FF0x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x10y13efgEv
  ~FF0x10y1(); // tgen
  FF0x10y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y13abcEv");}
void  ccc::FF0x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y13pqrEv");}
void  ccc::FF0x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y13efgEv");}
ccc::FF0x10y1 ::~FF0x10y1(){ note_dtor("_ZN3ccc8FF0x10y1E", this);} // tgen
ccc::FF0x10y1 ::FF0x10y1(){ note_ctor("_ZN3ccc8FF0x10y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y1E, buf);
    ::ccc::FF0x10y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y1E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y1E);
    dp->::ccc::FF0x10y1::~FF0x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y1E(Test__ZN3ccc8FF0x10y1E, "_ZN3ccc8FF0x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y1C1Ev();
extern void _ZN3ccc8FF0x10y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y1E[] = {
  NSPAIR(_ZN3ccc8FF0x10y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y1E[];
extern void _ZN3ccc8FF0x10y13abcEv();
extern void _ZN3ccc8FF0x10y13efgEv();
extern void _ZN3ccc8FF0x10y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y1E[] = {
  {&(_ZTVN3ccc8FF0x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y1E[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y1E = {  "_ZN3ccc8FF0x10y1E", // class name
  bases__ZN3ccc8FF0x10y1E, 2,
  &(vtc__ZN3ccc8FF0x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y2  : virtual ::ccc::EE0x10 {
  virtual void  efg(); // _ZN3ccc8FF0x10y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y23pqrEv
  ~FF0x10y2(); // tgen
  FF0x10y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y23efgEv");}
void  ccc::FF0x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y23abcEv");}
void  ccc::FF0x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y23pqrEv");}
ccc::FF0x10y2 ::~FF0x10y2(){ note_dtor("_ZN3ccc8FF0x10y2E", this);} // tgen
ccc::FF0x10y2 ::FF0x10y2(){ note_ctor("_ZN3ccc8FF0x10y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y2E, buf);
    ::ccc::FF0x10y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y2E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y2E);
    dp->::ccc::FF0x10y2::~FF0x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y2E(Test__ZN3ccc8FF0x10y2E, "_ZN3ccc8FF0x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y2C1Ev();
extern void _ZN3ccc8FF0x10y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y2E[] = {
  NSPAIR(_ZN3ccc8FF0x10y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y2E[];
extern void _ZN3ccc8FF0x10y23abcEv();
extern void _ZN3ccc8FF0x10y23efgEv();
extern void _ZN3ccc8FF0x10y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y2E[] = {
  {&(_ZTVN3ccc8FF0x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y2E[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y2E = {  "_ZN3ccc8FF0x10y2E", // class name
  bases__ZN3ccc8FF0x10y2E, 2,
  &(vtc__ZN3ccc8FF0x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y3  : virtual ::ccc::EE0x10 {
  virtual void  efg(); // _ZN3ccc8FF0x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x10y33abcEv
  ~FF0x10y3(); // tgen
  FF0x10y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y33efgEv");}
void  ccc::FF0x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y33pqrEv");}
void  ccc::FF0x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y33abcEv");}
ccc::FF0x10y3 ::~FF0x10y3(){ note_dtor("_ZN3ccc8FF0x10y3E", this);} // tgen
ccc::FF0x10y3 ::FF0x10y3(){ note_ctor("_ZN3ccc8FF0x10y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y3E, buf);
    ::ccc::FF0x10y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y3E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y3E);
    dp->::ccc::FF0x10y3::~FF0x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y3E(Test__ZN3ccc8FF0x10y3E, "_ZN3ccc8FF0x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y3C1Ev();
extern void _ZN3ccc8FF0x10y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y3E[] = {
  NSPAIR(_ZN3ccc8FF0x10y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y3E[];
extern void _ZN3ccc8FF0x10y33abcEv();
extern void _ZN3ccc8FF0x10y33efgEv();
extern void _ZN3ccc8FF0x10y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y3E[] = {
  {&(_ZTVN3ccc8FF0x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y3E[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y3E = {  "_ZN3ccc8FF0x10y3E", // class name
  bases__ZN3ccc8FF0x10y3E, 2,
  &(vtc__ZN3ccc8FF0x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y4  : virtual ::ccc::EE0x10 {
  virtual void  pqr(); // _ZN3ccc8FF0x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x10y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x10y43efgEv
  ~FF0x10y4(); // tgen
  FF0x10y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y43pqrEv");}
void  ccc::FF0x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y43abcEv");}
void  ccc::FF0x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y43efgEv");}
ccc::FF0x10y4 ::~FF0x10y4(){ note_dtor("_ZN3ccc8FF0x10y4E", this);} // tgen
ccc::FF0x10y4 ::FF0x10y4(){ note_ctor("_ZN3ccc8FF0x10y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y4E, buf);
    ::ccc::FF0x10y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y4E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y4E);
    dp->::ccc::FF0x10y4::~FF0x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y4E(Test__ZN3ccc8FF0x10y4E, "_ZN3ccc8FF0x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y4C1Ev();
extern void _ZN3ccc8FF0x10y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y4E[] = {
  NSPAIR(_ZN3ccc8FF0x10y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y4E[];
extern void _ZN3ccc8FF0x10y43abcEv();
extern void _ZN3ccc8FF0x10y43efgEv();
extern void _ZN3ccc8FF0x10y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y4E[] = {
  {&(_ZTVN3ccc8FF0x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y4E[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y4E = {  "_ZN3ccc8FF0x10y4E", // class name
  bases__ZN3ccc8FF0x10y4E, 2,
  &(vtc__ZN3ccc8FF0x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y5  : virtual ::ccc::EE0x10 {
  virtual void  pqr(); // _ZN3ccc8FF0x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x10y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x10y53abcEv
  ~FF0x10y5(); // tgen
  FF0x10y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y53pqrEv");}
void  ccc::FF0x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y53efgEv");}
void  ccc::FF0x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y53abcEv");}
ccc::FF0x10y5 ::~FF0x10y5(){ note_dtor("_ZN3ccc8FF0x10y5E", this);} // tgen
ccc::FF0x10y5 ::FF0x10y5(){ note_ctor("_ZN3ccc8FF0x10y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y5E, buf);
    ::ccc::FF0x10y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y5E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y5E);
    dp->::ccc::FF0x10y5::~FF0x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y5E(Test__ZN3ccc8FF0x10y5E, "_ZN3ccc8FF0x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y5C1Ev();
extern void _ZN3ccc8FF0x10y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y5E[] = {
  NSPAIR(_ZN3ccc8FF0x10y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y5E[];
extern void _ZN3ccc8FF0x10y53abcEv();
extern void _ZN3ccc8FF0x10y53efgEv();
extern void _ZN3ccc8FF0x10y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y5E[] = {
  {&(_ZTVN3ccc8FF0x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y5E[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y5E = {  "_ZN3ccc8FF0x10y5E", // class name
  bases__ZN3ccc8FF0x10y5E, 2,
  &(vtc__ZN3ccc8FF0x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y6  : virtual ::ccc::EE0x10 {
  virtual void  abc(); // _ZN3ccc8FF0x10y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x10y63efgEv
  ~FF0x10y6(); // tgen
  FF0x10y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y63abcEv");}
void  ccc::FF0x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y63efgEv");}
ccc::FF0x10y6 ::~FF0x10y6(){ note_dtor("_ZN3ccc8FF0x10y6E", this);} // tgen
ccc::FF0x10y6 ::FF0x10y6(){ note_ctor("_ZN3ccc8FF0x10y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y6E, buf);
    ::ccc::FF0x10y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y6E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y6E);
    dp->::ccc::FF0x10y6::~FF0x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y6E(Test__ZN3ccc8FF0x10y6E, "_ZN3ccc8FF0x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y6C1Ev();
extern void _ZN3ccc8FF0x10y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y6E[] = {
  NSPAIR(_ZN3ccc8FF0x10y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y6E[];
extern void _ZN3ccc8FF0x10y63abcEv();
extern void _ZN3ccc8FF0x10y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y6E[] = {
  {&(_ZTVN3ccc8FF0x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y6E[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y6E = {  "_ZN3ccc8FF0x10y6E", // class name
  bases__ZN3ccc8FF0x10y6E, 2,
  &(vtc__ZN3ccc8FF0x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y6E),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
namespace ccc { 
struct  FF0x10y7  : virtual ::ccc::EE0x10 {
  virtual void  abc(); // _ZN3ccc8FF0x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y73pqrEv
  ~FF0x10y7(); // tgen
  FF0x10y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y73abcEv");}
void  ccc::FF0x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y73pqrEv");}
ccc::FF0x10y7 ::~FF0x10y7(){ note_dtor("_ZN3ccc8FF0x10y7E", this);} // tgen
ccc::FF0x10y7 ::FF0x10y7(){ note_ctor("_ZN3ccc8FF0x10y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y7E, buf);
    ::ccc::FF0x10y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y7E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y7E);
    dp->::ccc::FF0x10y7::~FF0x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y7E(Test__ZN3ccc8FF0x10y7E, "_ZN3ccc8FF0x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y7C1Ev();
extern void _ZN3ccc8FF0x10y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y7E[] = {
  NSPAIR(_ZN3ccc8FF0x10y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y7E[];
extern void _ZN3ccc8FF0x10y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x10y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y7E[] = {
  {&(_ZTVN3ccc8FF0x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y7E[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y7E = {  "_ZN3ccc8FF0x10y7E", // class name
  bases__ZN3ccc8FF0x10y7E, 2,
  &(vtc__ZN3ccc8FF0x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y8  : virtual ::ccc::EE0x10 {
  virtual void  efg(); // _ZN3ccc8FF0x10y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x10y83abcEv
  ~FF0x10y8(); // tgen
  FF0x10y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y83efgEv");}
void  ccc::FF0x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x10y83abcEv");}
ccc::FF0x10y8 ::~FF0x10y8(){ note_dtor("_ZN3ccc8FF0x10y8E", this);} // tgen
ccc::FF0x10y8 ::FF0x10y8(){ note_ctor("_ZN3ccc8FF0x10y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y8E, buf);
    ::ccc::FF0x10y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y8E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y8E);
    dp->::ccc::FF0x10y8::~FF0x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y8E(Test__ZN3ccc8FF0x10y8E, "_ZN3ccc8FF0x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y8C1Ev();
extern void _ZN3ccc8FF0x10y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y8E[] = {
  NSPAIR(_ZN3ccc8FF0x10y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y8E[];
extern void _ZN3ccc8FF0x10y83abcEv();
extern void _ZN3ccc8FF0x10y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y8E[] = {
  {&(_ZTVN3ccc8FF0x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y8E[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y8E = {  "_ZN3ccc8FF0x10y8E", // class name
  bases__ZN3ccc8FF0x10y8E, 2,
  &(vtc__ZN3ccc8FF0x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y9  : virtual ::ccc::EE0x10 {
  virtual void  efg(); // _ZN3ccc8FF0x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x10y93pqrEv
  ~FF0x10y9(); // tgen
  FF0x10y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x10y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x10y93efgEv");}
void  ccc::FF0x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x10y93pqrEv");}
ccc::FF0x10y9 ::~FF0x10y9(){ note_dtor("_ZN3ccc8FF0x10y9E", this);} // tgen
ccc::FF0x10y9 ::FF0x10y9(){ note_ctor("_ZN3ccc8FF0x10y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x10y9E, buf);
    ::ccc::FF0x10y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x10y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y9E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc8FF0x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x10y9E);
    dp->::ccc::FF0x10y9::~FF0x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x10y9E(Test__ZN3ccc8FF0x10y9E, "_ZN3ccc8FF0x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x10y9C1Ev();
extern void _ZN3ccc8FF0x10y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x10y9E[] = {
  NSPAIR(_ZN3ccc8FF0x10y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc8FF0x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x10y93efgEv();
extern void _ZN3ccc8FF0x10y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x10y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x10y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x10y9E[] = {
  {&(_ZTVN3ccc8FF0x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x10y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_8FF0x10y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x10y9E[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x10y9E = {  "_ZN3ccc8FF0x10y9E", // class name
  bases__ZN3ccc8FF0x10y9E, 2,
  &(vtc__ZN3ccc8FF0x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x10y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x10y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x10y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x10y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y10  : virtual ::ccc::EE0x10 {
  virtual void  pqr(); // _ZN3ccc9FF0x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x10y103abcEv
  ~FF0x10y10(); // tgen
  FF0x10y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x10y103pqrEv");}
void  ccc::FF0x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x10y103abcEv");}
ccc::FF0x10y10 ::~FF0x10y10(){ note_dtor("_ZN3ccc9FF0x10y10E", this);} // tgen
ccc::FF0x10y10 ::FF0x10y10(){ note_ctor("_ZN3ccc9FF0x10y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y10E, buf);
    ::ccc::FF0x10y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y10E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y10E);
    dp->::ccc::FF0x10y10::~FF0x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y10E(Test__ZN3ccc9FF0x10y10E, "_ZN3ccc9FF0x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y10C1Ev();
extern void _ZN3ccc9FF0x10y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y10E[] = {
  NSPAIR(_ZN3ccc9FF0x10y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y10E[];
extern void _ZN3ccc9FF0x10y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x10y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y10E[] = {
  {&(_ZTVN3ccc9FF0x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y10E[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y10E = {  "_ZN3ccc9FF0x10y10E", // class name
  bases__ZN3ccc9FF0x10y10E, 2,
  &(vtc__ZN3ccc9FF0x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y11  : virtual ::ccc::EE0x10 {
  virtual void  pqr(); // _ZN3ccc9FF0x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x10y113efgEv
  ~FF0x10y11(); // tgen
  FF0x10y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x10y113pqrEv");}
void  ccc::FF0x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x10y113efgEv");}
ccc::FF0x10y11 ::~FF0x10y11(){ note_dtor("_ZN3ccc9FF0x10y11E", this);} // tgen
ccc::FF0x10y11 ::FF0x10y11(){ note_ctor("_ZN3ccc9FF0x10y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y11E, buf);
    ::ccc::FF0x10y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y11E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y11E);
    dp->::ccc::FF0x10y11::~FF0x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y11E(Test__ZN3ccc9FF0x10y11E, "_ZN3ccc9FF0x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y11C1Ev();
extern void _ZN3ccc9FF0x10y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y11E[] = {
  NSPAIR(_ZN3ccc9FF0x10y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF0x10y113efgEv();
extern void _ZN3ccc9FF0x10y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y11E[] = {
  {&(_ZTVN3ccc9FF0x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y11E[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y11E = {  "_ZN3ccc9FF0x10y11E", // class name
  bases__ZN3ccc9FF0x10y11E, 2,
  &(vtc__ZN3ccc9FF0x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y12  : virtual ::ccc::EE0x10 {
  virtual void  abc(); // _ZN3ccc9FF0x10y123abcEv
  ~FF0x10y12(); // tgen
  FF0x10y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x10y123abcEv");}
ccc::FF0x10y12 ::~FF0x10y12(){ note_dtor("_ZN3ccc9FF0x10y12E", this);} // tgen
ccc::FF0x10y12 ::FF0x10y12(){ note_ctor("_ZN3ccc9FF0x10y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y12E, buf);
    ::ccc::FF0x10y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y12E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y12E);
    dp->::ccc::FF0x10y12::~FF0x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y12E(Test__ZN3ccc9FF0x10y12E, "_ZN3ccc9FF0x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y12C1Ev();
extern void _ZN3ccc9FF0x10y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y12E[] = {
  NSPAIR(_ZN3ccc9FF0x10y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y12E[];
extern void _ZN3ccc9FF0x10y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y12E[] = {
  {&(_ZTVN3ccc9FF0x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y12E[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y12E = {  "_ZN3ccc9FF0x10y12E", // class name
  bases__ZN3ccc9FF0x10y12E, 2,
  &(vtc__ZN3ccc9FF0x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y13  : virtual ::ccc::EE0x10 {
  virtual void  efg(); // _ZN3ccc9FF0x10y133efgEv
  ~FF0x10y13(); // tgen
  FF0x10y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x10y133efgEv");}
ccc::FF0x10y13 ::~FF0x10y13(){ note_dtor("_ZN3ccc9FF0x10y13E", this);} // tgen
ccc::FF0x10y13 ::FF0x10y13(){ note_ctor("_ZN3ccc9FF0x10y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y13E, buf);
    ::ccc::FF0x10y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y13E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y13E);
    dp->::ccc::FF0x10y13::~FF0x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y13E(Test__ZN3ccc9FF0x10y13E, "_ZN3ccc9FF0x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y13C1Ev();
extern void _ZN3ccc9FF0x10y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y13E[] = {
  NSPAIR(_ZN3ccc9FF0x10y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF0x10y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y13E[] = {
  {&(_ZTVN3ccc9FF0x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y13E[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y13E = {  "_ZN3ccc9FF0x10y13E", // class name
  bases__ZN3ccc9FF0x10y13E, 2,
  &(vtc__ZN3ccc9FF0x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y14  : virtual ::ccc::EE0x10 {
  virtual void  pqr(); // _ZN3ccc9FF0x10y143pqrEv
  ~FF0x10y14(); // tgen
  FF0x10y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x10y143pqrEv");}
ccc::FF0x10y14 ::~FF0x10y14(){ note_dtor("_ZN3ccc9FF0x10y14E", this);} // tgen
ccc::FF0x10y14 ::FF0x10y14(){ note_ctor("_ZN3ccc9FF0x10y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y14E, buf);
    ::ccc::FF0x10y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y14E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y14E);
    dp->::ccc::FF0x10y14::~FF0x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y14E(Test__ZN3ccc9FF0x10y14E, "_ZN3ccc9FF0x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y14C1Ev();
extern void _ZN3ccc9FF0x10y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y14E[] = {
  NSPAIR(_ZN3ccc9FF0x10y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x10y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x10y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y14E[] = {
  {&(_ZTVN3ccc9FF0x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y14E[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y14E = {  "_ZN3ccc9FF0x10y14E", // class name
  bases__ZN3ccc9FF0x10y14E, 2,
  &(vtc__ZN3ccc9FF0x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x10y15  : virtual ::ccc::EE0x10 {
  ~FF0x10y15(); // tgen
  FF0x10y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x10y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2}}
}
namespace ccc { 
ccc::FF0x10y15 ::~FF0x10y15(){ note_dtor("_ZN3ccc9FF0x10y15E", this);} // tgen
ccc::FF0x10y15 ::FF0x10y15(){ note_ctor("_ZN3ccc9FF0x10y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x10y15E, buf);
    ::ccc::FF0x10y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x10y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y15E");
    check_base_class_offset(lv, (::ccc::EE0x10*), 0, "_ZN3ccc9FF0x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x10y15E);
    dp->::ccc::FF0x10y15::~FF0x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x10y15E(Test__ZN3ccc9FF0x10y15E, "_ZN3ccc9FF0x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x10y15C1Ev();
extern void _ZN3ccc9FF0x10y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x10y15E[] = {
  NSPAIR(_ZN3ccc9FF0x10y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x10E[];
static Base_Class bases__ZN3ccc9FF0x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x10y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv)();
extern void _ZN3ccc6EE0x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv)();
extern void _ZN3ccc6EE0x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x10y15E[] = {
  {&(_ZTVN3ccc9FF0x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x10y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x10E__NS_9FF0x10y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x10y15E[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x103pqrEv,_ZTv0_n20_N3ccc6EE0x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x103abcEv,_ZTv0_n12_N3ccc6EE0x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x10y15E = {  "_ZN3ccc9FF0x10y15E", // class name
  bases__ZN3ccc9FF0x10y15E, 2,
  &(vtc__ZN3ccc9FF0x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x10y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x10y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x10y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x10y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y0  : virtual ::ccc::EE0x11 {
  virtual void  abc(); // _ZN3ccc8FF0x11y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y03pqrEv
  ~FF0x11y0(); // tgen
  FF0x11y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y03abcEv");}
void  ccc::FF0x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y03efgEv");}
void  ccc::FF0x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y03pqrEv");}
ccc::FF0x11y0 ::~FF0x11y0(){ note_dtor("_ZN3ccc8FF0x11y0E", this);} // tgen
ccc::FF0x11y0 ::FF0x11y0(){ note_ctor("_ZN3ccc8FF0x11y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y0E, buf);
    ::ccc::FF0x11y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y0E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y0E);
    dp->::ccc::FF0x11y0::~FF0x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y0E(Test__ZN3ccc8FF0x11y0E, "_ZN3ccc8FF0x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y0C1Ev();
extern void _ZN3ccc8FF0x11y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y0E[] = {
  NSPAIR(_ZN3ccc8FF0x11y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y0E[];
extern void _ZN3ccc8FF0x11y03abcEv();
extern void _ZN3ccc8FF0x11y03efgEv();
extern void _ZN3ccc8FF0x11y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y0E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y0E[] = {
  {&(_ZTVN3ccc8FF0x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y0E[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y0E = {  "_ZN3ccc8FF0x11y0E", // class name
  bases__ZN3ccc8FF0x11y0E, 2,
  &(vtc__ZN3ccc8FF0x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y1  : virtual ::ccc::EE0x11 {
  virtual void  abc(); // _ZN3ccc8FF0x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x11y13efgEv
  ~FF0x11y1(); // tgen
  FF0x11y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y13abcEv");}
void  ccc::FF0x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y13pqrEv");}
void  ccc::FF0x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y13efgEv");}
ccc::FF0x11y1 ::~FF0x11y1(){ note_dtor("_ZN3ccc8FF0x11y1E", this);} // tgen
ccc::FF0x11y1 ::FF0x11y1(){ note_ctor("_ZN3ccc8FF0x11y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y1E, buf);
    ::ccc::FF0x11y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y1E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y1E);
    dp->::ccc::FF0x11y1::~FF0x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y1E(Test__ZN3ccc8FF0x11y1E, "_ZN3ccc8FF0x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y1C1Ev();
extern void _ZN3ccc8FF0x11y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y1E[] = {
  NSPAIR(_ZN3ccc8FF0x11y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y1E[];
extern void _ZN3ccc8FF0x11y13abcEv();
extern void _ZN3ccc8FF0x11y13efgEv();
extern void _ZN3ccc8FF0x11y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y1E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y1E[] = {
  {&(_ZTVN3ccc8FF0x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y1E[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y1E = {  "_ZN3ccc8FF0x11y1E", // class name
  bases__ZN3ccc8FF0x11y1E, 2,
  &(vtc__ZN3ccc8FF0x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y2  : virtual ::ccc::EE0x11 {
  virtual void  efg(); // _ZN3ccc8FF0x11y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y23pqrEv
  ~FF0x11y2(); // tgen
  FF0x11y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y23efgEv");}
void  ccc::FF0x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y23abcEv");}
void  ccc::FF0x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y23pqrEv");}
ccc::FF0x11y2 ::~FF0x11y2(){ note_dtor("_ZN3ccc8FF0x11y2E", this);} // tgen
ccc::FF0x11y2 ::FF0x11y2(){ note_ctor("_ZN3ccc8FF0x11y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y2E, buf);
    ::ccc::FF0x11y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y2E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y2E);
    dp->::ccc::FF0x11y2::~FF0x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y2E(Test__ZN3ccc8FF0x11y2E, "_ZN3ccc8FF0x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y2C1Ev();
extern void _ZN3ccc8FF0x11y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y2E[] = {
  NSPAIR(_ZN3ccc8FF0x11y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y2E[];
extern void _ZN3ccc8FF0x11y23abcEv();
extern void _ZN3ccc8FF0x11y23efgEv();
extern void _ZN3ccc8FF0x11y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y2E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y2E[] = {
  {&(_ZTVN3ccc8FF0x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y2E[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y2E = {  "_ZN3ccc8FF0x11y2E", // class name
  bases__ZN3ccc8FF0x11y2E, 2,
  &(vtc__ZN3ccc8FF0x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y3  : virtual ::ccc::EE0x11 {
  virtual void  efg(); // _ZN3ccc8FF0x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x11y33abcEv
  ~FF0x11y3(); // tgen
  FF0x11y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y33efgEv");}
void  ccc::FF0x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y33pqrEv");}
void  ccc::FF0x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y33abcEv");}
ccc::FF0x11y3 ::~FF0x11y3(){ note_dtor("_ZN3ccc8FF0x11y3E", this);} // tgen
ccc::FF0x11y3 ::FF0x11y3(){ note_ctor("_ZN3ccc8FF0x11y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y3E, buf);
    ::ccc::FF0x11y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y3E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y3E);
    dp->::ccc::FF0x11y3::~FF0x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y3E(Test__ZN3ccc8FF0x11y3E, "_ZN3ccc8FF0x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y3C1Ev();
extern void _ZN3ccc8FF0x11y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y3E[] = {
  NSPAIR(_ZN3ccc8FF0x11y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y3E[];
extern void _ZN3ccc8FF0x11y33abcEv();
extern void _ZN3ccc8FF0x11y33efgEv();
extern void _ZN3ccc8FF0x11y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y3E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y3E[] = {
  {&(_ZTVN3ccc8FF0x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y3E[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y3E = {  "_ZN3ccc8FF0x11y3E", // class name
  bases__ZN3ccc8FF0x11y3E, 2,
  &(vtc__ZN3ccc8FF0x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y4  : virtual ::ccc::EE0x11 {
  virtual void  pqr(); // _ZN3ccc8FF0x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x11y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x11y43efgEv
  ~FF0x11y4(); // tgen
  FF0x11y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y43pqrEv");}
void  ccc::FF0x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y43abcEv");}
void  ccc::FF0x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y43efgEv");}
ccc::FF0x11y4 ::~FF0x11y4(){ note_dtor("_ZN3ccc8FF0x11y4E", this);} // tgen
ccc::FF0x11y4 ::FF0x11y4(){ note_ctor("_ZN3ccc8FF0x11y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y4E, buf);
    ::ccc::FF0x11y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y4E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y4E);
    dp->::ccc::FF0x11y4::~FF0x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y4E(Test__ZN3ccc8FF0x11y4E, "_ZN3ccc8FF0x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y4C1Ev();
extern void _ZN3ccc8FF0x11y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y4E[] = {
  NSPAIR(_ZN3ccc8FF0x11y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y4E[];
extern void _ZN3ccc8FF0x11y43abcEv();
extern void _ZN3ccc8FF0x11y43efgEv();
extern void _ZN3ccc8FF0x11y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y4E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y4E[] = {
  {&(_ZTVN3ccc8FF0x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y4E[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y4E = {  "_ZN3ccc8FF0x11y4E", // class name
  bases__ZN3ccc8FF0x11y4E, 2,
  &(vtc__ZN3ccc8FF0x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y5  : virtual ::ccc::EE0x11 {
  virtual void  pqr(); // _ZN3ccc8FF0x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x11y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x11y53abcEv
  ~FF0x11y5(); // tgen
  FF0x11y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y53pqrEv");}
void  ccc::FF0x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y53efgEv");}
void  ccc::FF0x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y53abcEv");}
ccc::FF0x11y5 ::~FF0x11y5(){ note_dtor("_ZN3ccc8FF0x11y5E", this);} // tgen
ccc::FF0x11y5 ::FF0x11y5(){ note_ctor("_ZN3ccc8FF0x11y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y5E, buf);
    ::ccc::FF0x11y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y5E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y5E);
    dp->::ccc::FF0x11y5::~FF0x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y5E(Test__ZN3ccc8FF0x11y5E, "_ZN3ccc8FF0x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y5C1Ev();
extern void _ZN3ccc8FF0x11y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y5E[] = {
  NSPAIR(_ZN3ccc8FF0x11y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y5E[];
extern void _ZN3ccc8FF0x11y53abcEv();
extern void _ZN3ccc8FF0x11y53efgEv();
extern void _ZN3ccc8FF0x11y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y5E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y5E[] = {
  {&(_ZTVN3ccc8FF0x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y5E[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y5E = {  "_ZN3ccc8FF0x11y5E", // class name
  bases__ZN3ccc8FF0x11y5E, 2,
  &(vtc__ZN3ccc8FF0x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y6  : virtual ::ccc::EE0x11 {
  virtual void  abc(); // _ZN3ccc8FF0x11y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x11y63efgEv
  ~FF0x11y6(); // tgen
  FF0x11y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y63abcEv");}
void  ccc::FF0x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y63efgEv");}
ccc::FF0x11y6 ::~FF0x11y6(){ note_dtor("_ZN3ccc8FF0x11y6E", this);} // tgen
ccc::FF0x11y6 ::FF0x11y6(){ note_ctor("_ZN3ccc8FF0x11y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y6E, buf);
    ::ccc::FF0x11y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y6E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y6E);
    dp->::ccc::FF0x11y6::~FF0x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y6E(Test__ZN3ccc8FF0x11y6E, "_ZN3ccc8FF0x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y6C1Ev();
extern void _ZN3ccc8FF0x11y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y6E[] = {
  NSPAIR(_ZN3ccc8FF0x11y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y6E[];
extern void _ZN3ccc8FF0x11y63abcEv();
extern void _ZN3ccc8FF0x11y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y6E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y6E[] = {
  {&(_ZTVN3ccc8FF0x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y6E[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y6E = {  "_ZN3ccc8FF0x11y6E", // class name
  bases__ZN3ccc8FF0x11y6E, 2,
  &(vtc__ZN3ccc8FF0x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y7  : virtual ::ccc::EE0x11 {
  virtual void  abc(); // _ZN3ccc8FF0x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y73pqrEv
  ~FF0x11y7(); // tgen
  FF0x11y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y73abcEv");}
void  ccc::FF0x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y73pqrEv");}
ccc::FF0x11y7 ::~FF0x11y7(){ note_dtor("_ZN3ccc8FF0x11y7E", this);} // tgen
ccc::FF0x11y7 ::FF0x11y7(){ note_ctor("_ZN3ccc8FF0x11y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y7E, buf);
    ::ccc::FF0x11y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y7E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y7E);
    dp->::ccc::FF0x11y7::~FF0x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y7E(Test__ZN3ccc8FF0x11y7E, "_ZN3ccc8FF0x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y7C1Ev();
extern void _ZN3ccc8FF0x11y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y7E[] = {
  NSPAIR(_ZN3ccc8FF0x11y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y7E[];
extern void _ZN3ccc8FF0x11y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x11y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y7E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y7E[] = {
  {&(_ZTVN3ccc8FF0x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y7E[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y7E = {  "_ZN3ccc8FF0x11y7E", // class name
  bases__ZN3ccc8FF0x11y7E, 2,
  &(vtc__ZN3ccc8FF0x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y8  : virtual ::ccc::EE0x11 {
  virtual void  efg(); // _ZN3ccc8FF0x11y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x11y83abcEv
  ~FF0x11y8(); // tgen
  FF0x11y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y83efgEv");}
void  ccc::FF0x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x11y83abcEv");}
ccc::FF0x11y8 ::~FF0x11y8(){ note_dtor("_ZN3ccc8FF0x11y8E", this);} // tgen
ccc::FF0x11y8 ::FF0x11y8(){ note_ctor("_ZN3ccc8FF0x11y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y8E, buf);
    ::ccc::FF0x11y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y8E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y8E);
    dp->::ccc::FF0x11y8::~FF0x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y8E(Test__ZN3ccc8FF0x11y8E, "_ZN3ccc8FF0x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y8C1Ev();
extern void _ZN3ccc8FF0x11y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y8E[] = {
  NSPAIR(_ZN3ccc8FF0x11y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y8E[];
extern void _ZN3ccc8FF0x11y83abcEv();
extern void _ZN3ccc8FF0x11y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y8E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y8E[] = {
  {&(_ZTVN3ccc8FF0x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y8E[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y8E = {  "_ZN3ccc8FF0x11y8E", // class name
  bases__ZN3ccc8FF0x11y8E, 2,
  &(vtc__ZN3ccc8FF0x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y8E),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
namespace ccc { 
struct  FF0x11y9  : virtual ::ccc::EE0x11 {
  virtual void  efg(); // _ZN3ccc8FF0x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x11y93pqrEv
  ~FF0x11y9(); // tgen
  FF0x11y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x11y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x11y93efgEv");}
void  ccc::FF0x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x11y93pqrEv");}
ccc::FF0x11y9 ::~FF0x11y9(){ note_dtor("_ZN3ccc8FF0x11y9E", this);} // tgen
ccc::FF0x11y9 ::FF0x11y9(){ note_ctor("_ZN3ccc8FF0x11y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x11y9E, buf);
    ::ccc::FF0x11y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x11y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y9E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc8FF0x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x11y9E);
    dp->::ccc::FF0x11y9::~FF0x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x11y9E(Test__ZN3ccc8FF0x11y9E, "_ZN3ccc8FF0x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x11y9C1Ev();
extern void _ZN3ccc8FF0x11y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x11y9E[] = {
  NSPAIR(_ZN3ccc8FF0x11y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc8FF0x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x11y93efgEv();
extern void _ZN3ccc8FF0x11y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x11y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x11y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x11y9E[] = {
  {&(_ZTVN3ccc8FF0x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x11y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_8FF0x11y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x11y9E[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x11y9E = {  "_ZN3ccc8FF0x11y9E", // class name
  bases__ZN3ccc8FF0x11y9E, 2,
  &(vtc__ZN3ccc8FF0x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x11y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x11y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x11y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x11y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y10  : virtual ::ccc::EE0x11 {
  virtual void  pqr(); // _ZN3ccc9FF0x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x11y103abcEv
  ~FF0x11y10(); // tgen
  FF0x11y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x11y103pqrEv");}
void  ccc::FF0x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x11y103abcEv");}
ccc::FF0x11y10 ::~FF0x11y10(){ note_dtor("_ZN3ccc9FF0x11y10E", this);} // tgen
ccc::FF0x11y10 ::FF0x11y10(){ note_ctor("_ZN3ccc9FF0x11y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y10E, buf);
    ::ccc::FF0x11y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y10E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y10E);
    dp->::ccc::FF0x11y10::~FF0x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y10E(Test__ZN3ccc9FF0x11y10E, "_ZN3ccc9FF0x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y10C1Ev();
extern void _ZN3ccc9FF0x11y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y10E[] = {
  NSPAIR(_ZN3ccc9FF0x11y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y10E[];
extern void _ZN3ccc9FF0x11y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF0x11y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y10E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y10E[] = {
  {&(_ZTVN3ccc9FF0x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y10E[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y10E = {  "_ZN3ccc9FF0x11y10E", // class name
  bases__ZN3ccc9FF0x11y10E, 2,
  &(vtc__ZN3ccc9FF0x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y11  : virtual ::ccc::EE0x11 {
  virtual void  pqr(); // _ZN3ccc9FF0x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x11y113efgEv
  ~FF0x11y11(); // tgen
  FF0x11y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x11y113pqrEv");}
void  ccc::FF0x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x11y113efgEv");}
ccc::FF0x11y11 ::~FF0x11y11(){ note_dtor("_ZN3ccc9FF0x11y11E", this);} // tgen
ccc::FF0x11y11 ::FF0x11y11(){ note_ctor("_ZN3ccc9FF0x11y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y11E, buf);
    ::ccc::FF0x11y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y11E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y11E);
    dp->::ccc::FF0x11y11::~FF0x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y11E(Test__ZN3ccc9FF0x11y11E, "_ZN3ccc9FF0x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y11C1Ev();
extern void _ZN3ccc9FF0x11y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y11E[] = {
  NSPAIR(_ZN3ccc9FF0x11y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x11y113efgEv();
extern void _ZN3ccc9FF0x11y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y11E[] = {
  {&(_ZTVN3ccc9FF0x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y11E[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y11E = {  "_ZN3ccc9FF0x11y11E", // class name
  bases__ZN3ccc9FF0x11y11E, 2,
  &(vtc__ZN3ccc9FF0x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y12  : virtual ::ccc::EE0x11 {
  virtual void  abc(); // _ZN3ccc9FF0x11y123abcEv
  ~FF0x11y12(); // tgen
  FF0x11y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF0x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x11y123abcEv");}
ccc::FF0x11y12 ::~FF0x11y12(){ note_dtor("_ZN3ccc9FF0x11y12E", this);} // tgen
ccc::FF0x11y12 ::FF0x11y12(){ note_ctor("_ZN3ccc9FF0x11y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y12E, buf);
    ::ccc::FF0x11y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y12E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y12E);
    dp->::ccc::FF0x11y12::~FF0x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y12E(Test__ZN3ccc9FF0x11y12E, "_ZN3ccc9FF0x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y12C1Ev();
extern void _ZN3ccc9FF0x11y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y12E[] = {
  NSPAIR(_ZN3ccc9FF0x11y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y12E[];
extern void _ZN3ccc9FF0x11y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y12E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y12E[] = {
  {&(_ZTVN3ccc9FF0x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y12E[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y12E = {  "_ZN3ccc9FF0x11y12E", // class name
  bases__ZN3ccc9FF0x11y12E, 2,
  &(vtc__ZN3ccc9FF0x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y13  : virtual ::ccc::EE0x11 {
  virtual void  efg(); // _ZN3ccc9FF0x11y133efgEv
  ~FF0x11y13(); // tgen
  FF0x11y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF0x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x11y133efgEv");}
ccc::FF0x11y13 ::~FF0x11y13(){ note_dtor("_ZN3ccc9FF0x11y13E", this);} // tgen
ccc::FF0x11y13 ::FF0x11y13(){ note_ctor("_ZN3ccc9FF0x11y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y13E, buf);
    ::ccc::FF0x11y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y13E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y13E);
    dp->::ccc::FF0x11y13::~FF0x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y13E(Test__ZN3ccc9FF0x11y13E, "_ZN3ccc9FF0x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y13C1Ev();
extern void _ZN3ccc9FF0x11y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y13E[] = {
  NSPAIR(_ZN3ccc9FF0x11y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x11y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y13E[] = {
  {&(_ZTVN3ccc9FF0x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y13E[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y13E = {  "_ZN3ccc9FF0x11y13E", // class name
  bases__ZN3ccc9FF0x11y13E, 2,
  &(vtc__ZN3ccc9FF0x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y14  : virtual ::ccc::EE0x11 {
  virtual void  pqr(); // _ZN3ccc9FF0x11y143pqrEv
  ~FF0x11y14(); // tgen
  FF0x11y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF0x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x11y143pqrEv");}
ccc::FF0x11y14 ::~FF0x11y14(){ note_dtor("_ZN3ccc9FF0x11y14E", this);} // tgen
ccc::FF0x11y14 ::FF0x11y14(){ note_ctor("_ZN3ccc9FF0x11y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y14E, buf);
    ::ccc::FF0x11y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y14E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y14E);
    dp->::ccc::FF0x11y14::~FF0x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y14E(Test__ZN3ccc9FF0x11y14E, "_ZN3ccc9FF0x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y14C1Ev();
extern void _ZN3ccc9FF0x11y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y14E[] = {
  NSPAIR(_ZN3ccc9FF0x11y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF0x11y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x11y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y14E[] = {
  {&(_ZTVN3ccc9FF0x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y14E[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y14E = {  "_ZN3ccc9FF0x11y14E", // class name
  bases__ZN3ccc9FF0x11y14E, 2,
  &(vtc__ZN3ccc9FF0x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x11y15  : virtual ::ccc::EE0x11 {
  ~FF0x11y15(); // tgen
  FF0x11y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x11y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2}}
}
namespace ccc { 
ccc::FF0x11y15 ::~FF0x11y15(){ note_dtor("_ZN3ccc9FF0x11y15E", this);} // tgen
ccc::FF0x11y15 ::FF0x11y15(){ note_ctor("_ZN3ccc9FF0x11y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x11y15E, buf);
    ::ccc::FF0x11y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x11y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y15E");
    check_base_class_offset(lv, (::ccc::EE0x11*), 0, "_ZN3ccc9FF0x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x11y15E);
    dp->::ccc::FF0x11y15::~FF0x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x11y15E(Test__ZN3ccc9FF0x11y15E, "_ZN3ccc9FF0x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x11y15C1Ev();
extern void _ZN3ccc9FF0x11y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x11y15E[] = {
  NSPAIR(_ZN3ccc9FF0x11y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x11E[];
static Base_Class bases__ZN3ccc9FF0x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x11y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv)();
extern void _ZN3ccc6EE0x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv)();
extern void _ZN3ccc6EE0x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x11y15E[] = {
  {&(_ZTVN3ccc9FF0x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x11y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x11E__NS_9FF0x11y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x11y15E[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x113pqrEv,_ZTv0_n20_N3ccc6EE0x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x113efgEv,_ZTv0_n16_N3ccc6EE0x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x11y15E = {  "_ZN3ccc9FF0x11y15E", // class name
  bases__ZN3ccc9FF0x11y15E, 2,
  &(vtc__ZN3ccc9FF0x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x11y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x11y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x11y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x11y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y0  : virtual ::ccc::EE0x12 {
  virtual void  abc(); // _ZN3ccc8FF0x12y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y03pqrEv
  ~FF0x12y0(); // tgen
  FF0x12y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y03abcEv");}
void  ccc::FF0x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y03efgEv");}
void  ccc::FF0x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y03pqrEv");}
ccc::FF0x12y0 ::~FF0x12y0(){ note_dtor("_ZN3ccc8FF0x12y0E", this);} // tgen
ccc::FF0x12y0 ::FF0x12y0(){ note_ctor("_ZN3ccc8FF0x12y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y0E, buf);
    ::ccc::FF0x12y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y0E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y0E);
    dp->::ccc::FF0x12y0::~FF0x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y0E(Test__ZN3ccc8FF0x12y0E, "_ZN3ccc8FF0x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y0C1Ev();
extern void _ZN3ccc8FF0x12y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y0E[] = {
  NSPAIR(_ZN3ccc8FF0x12y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y0E[];
extern void _ZN3ccc8FF0x12y03abcEv();
extern void _ZN3ccc8FF0x12y03efgEv();
extern void _ZN3ccc8FF0x12y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y0E[] = {
  {&(_ZTVN3ccc8FF0x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y0E[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y0E = {  "_ZN3ccc8FF0x12y0E", // class name
  bases__ZN3ccc8FF0x12y0E, 2,
  &(vtc__ZN3ccc8FF0x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y1  : virtual ::ccc::EE0x12 {
  virtual void  abc(); // _ZN3ccc8FF0x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x12y13efgEv
  ~FF0x12y1(); // tgen
  FF0x12y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y13abcEv");}
void  ccc::FF0x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y13pqrEv");}
void  ccc::FF0x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y13efgEv");}
ccc::FF0x12y1 ::~FF0x12y1(){ note_dtor("_ZN3ccc8FF0x12y1E", this);} // tgen
ccc::FF0x12y1 ::FF0x12y1(){ note_ctor("_ZN3ccc8FF0x12y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y1E, buf);
    ::ccc::FF0x12y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y1E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y1E);
    dp->::ccc::FF0x12y1::~FF0x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y1E(Test__ZN3ccc8FF0x12y1E, "_ZN3ccc8FF0x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y1C1Ev();
extern void _ZN3ccc8FF0x12y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y1E[] = {
  NSPAIR(_ZN3ccc8FF0x12y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y1E[];
extern void _ZN3ccc8FF0x12y13abcEv();
extern void _ZN3ccc8FF0x12y13efgEv();
extern void _ZN3ccc8FF0x12y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y1E[] = {
  {&(_ZTVN3ccc8FF0x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y1E[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y1E = {  "_ZN3ccc8FF0x12y1E", // class name
  bases__ZN3ccc8FF0x12y1E, 2,
  &(vtc__ZN3ccc8FF0x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y2  : virtual ::ccc::EE0x12 {
  virtual void  efg(); // _ZN3ccc8FF0x12y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y23pqrEv
  ~FF0x12y2(); // tgen
  FF0x12y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y23efgEv");}
void  ccc::FF0x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y23abcEv");}
void  ccc::FF0x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y23pqrEv");}
ccc::FF0x12y2 ::~FF0x12y2(){ note_dtor("_ZN3ccc8FF0x12y2E", this);} // tgen
ccc::FF0x12y2 ::FF0x12y2(){ note_ctor("_ZN3ccc8FF0x12y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y2E, buf);
    ::ccc::FF0x12y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y2E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y2E);
    dp->::ccc::FF0x12y2::~FF0x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y2E(Test__ZN3ccc8FF0x12y2E, "_ZN3ccc8FF0x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y2C1Ev();
extern void _ZN3ccc8FF0x12y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y2E[] = {
  NSPAIR(_ZN3ccc8FF0x12y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y2E[];
extern void _ZN3ccc8FF0x12y23abcEv();
extern void _ZN3ccc8FF0x12y23efgEv();
extern void _ZN3ccc8FF0x12y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y2E[] = {
  {&(_ZTVN3ccc8FF0x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y2E[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y2E = {  "_ZN3ccc8FF0x12y2E", // class name
  bases__ZN3ccc8FF0x12y2E, 2,
  &(vtc__ZN3ccc8FF0x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y3  : virtual ::ccc::EE0x12 {
  virtual void  efg(); // _ZN3ccc8FF0x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x12y33abcEv
  ~FF0x12y3(); // tgen
  FF0x12y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y33efgEv");}
void  ccc::FF0x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y33pqrEv");}
void  ccc::FF0x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y33abcEv");}
ccc::FF0x12y3 ::~FF0x12y3(){ note_dtor("_ZN3ccc8FF0x12y3E", this);} // tgen
ccc::FF0x12y3 ::FF0x12y3(){ note_ctor("_ZN3ccc8FF0x12y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y3E, buf);
    ::ccc::FF0x12y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y3E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y3E);
    dp->::ccc::FF0x12y3::~FF0x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y3E(Test__ZN3ccc8FF0x12y3E, "_ZN3ccc8FF0x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y3C1Ev();
extern void _ZN3ccc8FF0x12y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y3E[] = {
  NSPAIR(_ZN3ccc8FF0x12y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y3E[];
extern void _ZN3ccc8FF0x12y33abcEv();
extern void _ZN3ccc8FF0x12y33efgEv();
extern void _ZN3ccc8FF0x12y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y3E[] = {
  {&(_ZTVN3ccc8FF0x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y3E[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y3E = {  "_ZN3ccc8FF0x12y3E", // class name
  bases__ZN3ccc8FF0x12y3E, 2,
  &(vtc__ZN3ccc8FF0x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y4  : virtual ::ccc::EE0x12 {
  virtual void  pqr(); // _ZN3ccc8FF0x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x12y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x12y43efgEv
  ~FF0x12y4(); // tgen
  FF0x12y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y43pqrEv");}
void  ccc::FF0x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y43abcEv");}
void  ccc::FF0x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y43efgEv");}
ccc::FF0x12y4 ::~FF0x12y4(){ note_dtor("_ZN3ccc8FF0x12y4E", this);} // tgen
ccc::FF0x12y4 ::FF0x12y4(){ note_ctor("_ZN3ccc8FF0x12y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y4E, buf);
    ::ccc::FF0x12y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y4E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y4E);
    dp->::ccc::FF0x12y4::~FF0x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y4E(Test__ZN3ccc8FF0x12y4E, "_ZN3ccc8FF0x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y4C1Ev();
extern void _ZN3ccc8FF0x12y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y4E[] = {
  NSPAIR(_ZN3ccc8FF0x12y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y4E[];
extern void _ZN3ccc8FF0x12y43abcEv();
extern void _ZN3ccc8FF0x12y43efgEv();
extern void _ZN3ccc8FF0x12y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y4E[] = {
  {&(_ZTVN3ccc8FF0x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y4E[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y4E = {  "_ZN3ccc8FF0x12y4E", // class name
  bases__ZN3ccc8FF0x12y4E, 2,
  &(vtc__ZN3ccc8FF0x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y5  : virtual ::ccc::EE0x12 {
  virtual void  pqr(); // _ZN3ccc8FF0x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x12y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x12y53abcEv
  ~FF0x12y5(); // tgen
  FF0x12y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y53pqrEv");}
void  ccc::FF0x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y53efgEv");}
void  ccc::FF0x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y53abcEv");}
ccc::FF0x12y5 ::~FF0x12y5(){ note_dtor("_ZN3ccc8FF0x12y5E", this);} // tgen
ccc::FF0x12y5 ::FF0x12y5(){ note_ctor("_ZN3ccc8FF0x12y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y5E, buf);
    ::ccc::FF0x12y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y5E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y5E);
    dp->::ccc::FF0x12y5::~FF0x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y5E(Test__ZN3ccc8FF0x12y5E, "_ZN3ccc8FF0x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y5C1Ev();
extern void _ZN3ccc8FF0x12y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y5E[] = {
  NSPAIR(_ZN3ccc8FF0x12y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y5E[];
extern void _ZN3ccc8FF0x12y53abcEv();
extern void _ZN3ccc8FF0x12y53efgEv();
extern void _ZN3ccc8FF0x12y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y5E[] = {
  {&(_ZTVN3ccc8FF0x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y5E[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y5E = {  "_ZN3ccc8FF0x12y5E", // class name
  bases__ZN3ccc8FF0x12y5E, 2,
  &(vtc__ZN3ccc8FF0x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y6  : virtual ::ccc::EE0x12 {
  virtual void  abc(); // _ZN3ccc8FF0x12y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x12y63efgEv
  ~FF0x12y6(); // tgen
  FF0x12y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y63abcEv");}
void  ccc::FF0x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y63efgEv");}
ccc::FF0x12y6 ::~FF0x12y6(){ note_dtor("_ZN3ccc8FF0x12y6E", this);} // tgen
ccc::FF0x12y6 ::FF0x12y6(){ note_ctor("_ZN3ccc8FF0x12y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y6E, buf);
    ::ccc::FF0x12y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y6E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y6E);
    dp->::ccc::FF0x12y6::~FF0x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y6E(Test__ZN3ccc8FF0x12y6E, "_ZN3ccc8FF0x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y6C1Ev();
extern void _ZN3ccc8FF0x12y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y6E[] = {
  NSPAIR(_ZN3ccc8FF0x12y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y6E[];
extern void _ZN3ccc8FF0x12y63abcEv();
extern void _ZN3ccc8FF0x12y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y6E[] = {
  {&(_ZTVN3ccc8FF0x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y6E[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y6E = {  "_ZN3ccc8FF0x12y6E", // class name
  bases__ZN3ccc8FF0x12y6E, 2,
  &(vtc__ZN3ccc8FF0x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y7  : virtual ::ccc::EE0x12 {
  virtual void  abc(); // _ZN3ccc8FF0x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y73pqrEv
  ~FF0x12y7(); // tgen
  FF0x12y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y73abcEv");}
void  ccc::FF0x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y73pqrEv");}
ccc::FF0x12y7 ::~FF0x12y7(){ note_dtor("_ZN3ccc8FF0x12y7E", this);} // tgen
ccc::FF0x12y7 ::FF0x12y7(){ note_ctor("_ZN3ccc8FF0x12y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y7E, buf);
    ::ccc::FF0x12y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y7E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y7E);
    dp->::ccc::FF0x12y7::~FF0x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y7E(Test__ZN3ccc8FF0x12y7E, "_ZN3ccc8FF0x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y7C1Ev();
extern void _ZN3ccc8FF0x12y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y7E[] = {
  NSPAIR(_ZN3ccc8FF0x12y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y7E[];
extern void _ZN3ccc8FF0x12y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x12y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y7E[] = {
  {&(_ZTVN3ccc8FF0x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y7E[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y7E = {  "_ZN3ccc8FF0x12y7E", // class name
  bases__ZN3ccc8FF0x12y7E, 2,
  &(vtc__ZN3ccc8FF0x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y8  : virtual ::ccc::EE0x12 {
  virtual void  efg(); // _ZN3ccc8FF0x12y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x12y83abcEv
  ~FF0x12y8(); // tgen
  FF0x12y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y83efgEv");}
void  ccc::FF0x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x12y83abcEv");}
ccc::FF0x12y8 ::~FF0x12y8(){ note_dtor("_ZN3ccc8FF0x12y8E", this);} // tgen
ccc::FF0x12y8 ::FF0x12y8(){ note_ctor("_ZN3ccc8FF0x12y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y8E, buf);
    ::ccc::FF0x12y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y8E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y8E);
    dp->::ccc::FF0x12y8::~FF0x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y8E(Test__ZN3ccc8FF0x12y8E, "_ZN3ccc8FF0x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y8C1Ev();
extern void _ZN3ccc8FF0x12y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y8E[] = {
  NSPAIR(_ZN3ccc8FF0x12y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y8E[];
extern void _ZN3ccc8FF0x12y83abcEv();
extern void _ZN3ccc8FF0x12y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y8E[] = {
  {&(_ZTVN3ccc8FF0x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y8E[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y8E = {  "_ZN3ccc8FF0x12y8E", // class name
  bases__ZN3ccc8FF0x12y8E, 2,
  &(vtc__ZN3ccc8FF0x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y9  : virtual ::ccc::EE0x12 {
  virtual void  efg(); // _ZN3ccc8FF0x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x12y93pqrEv
  ~FF0x12y9(); // tgen
  FF0x12y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x12y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x12y93efgEv");}
void  ccc::FF0x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x12y93pqrEv");}
ccc::FF0x12y9 ::~FF0x12y9(){ note_dtor("_ZN3ccc8FF0x12y9E", this);} // tgen
ccc::FF0x12y9 ::FF0x12y9(){ note_ctor("_ZN3ccc8FF0x12y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x12y9E, buf);
    ::ccc::FF0x12y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x12y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y9E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc8FF0x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x12y9E);
    dp->::ccc::FF0x12y9::~FF0x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x12y9E(Test__ZN3ccc8FF0x12y9E, "_ZN3ccc8FF0x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x12y9C1Ev();
extern void _ZN3ccc8FF0x12y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x12y9E[] = {
  NSPAIR(_ZN3ccc8FF0x12y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc8FF0x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc8FF0x12y93efgEv();
extern void _ZN3ccc8FF0x12y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x12y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x12y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x12y9E[] = {
  {&(_ZTVN3ccc8FF0x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x12y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_8FF0x12y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x12y9E[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x12y9E = {  "_ZN3ccc8FF0x12y9E", // class name
  bases__ZN3ccc8FF0x12y9E, 2,
  &(vtc__ZN3ccc8FF0x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x12y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x12y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x12y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x12y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names202,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y10  : virtual ::ccc::EE0x12 {
  virtual void  pqr(); // _ZN3ccc9FF0x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x12y103abcEv
  ~FF0x12y10(); // tgen
  FF0x12y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x12y103pqrEv");}
void  ccc::FF0x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x12y103abcEv");}
ccc::FF0x12y10 ::~FF0x12y10(){ note_dtor("_ZN3ccc9FF0x12y10E", this);} // tgen
ccc::FF0x12y10 ::FF0x12y10(){ note_ctor("_ZN3ccc9FF0x12y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y10E, buf);
    ::ccc::FF0x12y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y10E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y10E);
    dp->::ccc::FF0x12y10::~FF0x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y10E(Test__ZN3ccc9FF0x12y10E, "_ZN3ccc9FF0x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y10C1Ev();
extern void _ZN3ccc9FF0x12y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y10E[] = {
  NSPAIR(_ZN3ccc9FF0x12y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y10E[];
extern void _ZN3ccc9FF0x12y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x12y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y10E[] = {
  {&(_ZTVN3ccc9FF0x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y10E[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y10E = {  "_ZN3ccc9FF0x12y10E", // class name
  bases__ZN3ccc9FF0x12y10E, 2,
  &(vtc__ZN3ccc9FF0x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y10E),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
namespace ccc { 
struct  FF0x12y11  : virtual ::ccc::EE0x12 {
  virtual void  pqr(); // _ZN3ccc9FF0x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x12y113efgEv
  ~FF0x12y11(); // tgen
  FF0x12y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x12y113pqrEv");}
void  ccc::FF0x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x12y113efgEv");}
ccc::FF0x12y11 ::~FF0x12y11(){ note_dtor("_ZN3ccc9FF0x12y11E", this);} // tgen
ccc::FF0x12y11 ::FF0x12y11(){ note_ctor("_ZN3ccc9FF0x12y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y11E, buf);
    ::ccc::FF0x12y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y11E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y11E);
    dp->::ccc::FF0x12y11::~FF0x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y11E(Test__ZN3ccc9FF0x12y11E, "_ZN3ccc9FF0x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y11C1Ev();
extern void _ZN3ccc9FF0x12y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y11E[] = {
  NSPAIR(_ZN3ccc9FF0x12y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF0x12y113efgEv();
extern void _ZN3ccc9FF0x12y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y11E[] = {
  {&(_ZTVN3ccc9FF0x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y11E[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y11E = {  "_ZN3ccc9FF0x12y11E", // class name
  bases__ZN3ccc9FF0x12y11E, 2,
  &(vtc__ZN3ccc9FF0x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names204,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y12  : virtual ::ccc::EE0x12 {
  virtual void  abc(); // _ZN3ccc9FF0x12y123abcEv
  ~FF0x12y12(); // tgen
  FF0x12y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF0x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x12y123abcEv");}
ccc::FF0x12y12 ::~FF0x12y12(){ note_dtor("_ZN3ccc9FF0x12y12E", this);} // tgen
ccc::FF0x12y12 ::FF0x12y12(){ note_ctor("_ZN3ccc9FF0x12y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y12E, buf);
    ::ccc::FF0x12y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y12E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y12E);
    dp->::ccc::FF0x12y12::~FF0x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y12E(Test__ZN3ccc9FF0x12y12E, "_ZN3ccc9FF0x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y12C1Ev();
extern void _ZN3ccc9FF0x12y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y12E[] = {
  NSPAIR(_ZN3ccc9FF0x12y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y12E[];
extern void _ZN3ccc9FF0x12y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y12E[] = {
  {&(_ZTVN3ccc9FF0x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y12E[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y12E = {  "_ZN3ccc9FF0x12y12E", // class name
  bases__ZN3ccc9FF0x12y12E, 2,
  &(vtc__ZN3ccc9FF0x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names205,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y13  : virtual ::ccc::EE0x12 {
  virtual void  efg(); // _ZN3ccc9FF0x12y133efgEv
  ~FF0x12y13(); // tgen
  FF0x12y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF0x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x12y133efgEv");}
ccc::FF0x12y13 ::~FF0x12y13(){ note_dtor("_ZN3ccc9FF0x12y13E", this);} // tgen
ccc::FF0x12y13 ::FF0x12y13(){ note_ctor("_ZN3ccc9FF0x12y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y13E, buf);
    ::ccc::FF0x12y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y13E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y13E);
    dp->::ccc::FF0x12y13::~FF0x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y13E(Test__ZN3ccc9FF0x12y13E, "_ZN3ccc9FF0x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y13C1Ev();
extern void _ZN3ccc9FF0x12y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y13E[] = {
  NSPAIR(_ZN3ccc9FF0x12y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF0x12y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y13E[] = {
  {&(_ZTVN3ccc9FF0x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y13E[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y13E = {  "_ZN3ccc9FF0x12y13E", // class name
  bases__ZN3ccc9FF0x12y13E, 2,
  &(vtc__ZN3ccc9FF0x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y14  : virtual ::ccc::EE0x12 {
  virtual void  pqr(); // _ZN3ccc9FF0x12y143pqrEv
  ~FF0x12y14(); // tgen
  FF0x12y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF0x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x12y143pqrEv");}
ccc::FF0x12y14 ::~FF0x12y14(){ note_dtor("_ZN3ccc9FF0x12y14E", this);} // tgen
ccc::FF0x12y14 ::FF0x12y14(){ note_ctor("_ZN3ccc9FF0x12y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y14E, buf);
    ::ccc::FF0x12y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y14E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y14E);
    dp->::ccc::FF0x12y14::~FF0x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y14E(Test__ZN3ccc9FF0x12y14E, "_ZN3ccc9FF0x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y14C1Ev();
extern void _ZN3ccc9FF0x12y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y14E[] = {
  NSPAIR(_ZN3ccc9FF0x12y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x12y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x12y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y14E[] = {
  {&(_ZTVN3ccc9FF0x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y14E[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y14E = {  "_ZN3ccc9FF0x12y14E", // class name
  bases__ZN3ccc9FF0x12y14E, 2,
  &(vtc__ZN3ccc9FF0x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x12y15  : virtual ::ccc::EE0x12 {
  ~FF0x12y15(); // tgen
  FF0x12y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x12y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1}}
}
namespace ccc { 
ccc::FF0x12y15 ::~FF0x12y15(){ note_dtor("_ZN3ccc9FF0x12y15E", this);} // tgen
ccc::FF0x12y15 ::FF0x12y15(){ note_ctor("_ZN3ccc9FF0x12y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x12y15E, buf);
    ::ccc::FF0x12y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x12y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y15E");
    check_base_class_offset(lv, (::ccc::EE0x12*), 0, "_ZN3ccc9FF0x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x12y15E);
    dp->::ccc::FF0x12y15::~FF0x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x12y15E(Test__ZN3ccc9FF0x12y15E, "_ZN3ccc9FF0x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x12y15C1Ev();
extern void _ZN3ccc9FF0x12y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x12y15E[] = {
  NSPAIR(_ZN3ccc9FF0x12y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x12E[];
static Base_Class bases__ZN3ccc9FF0x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x12y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x12y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv)();
extern void _ZN3ccc6EE0x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x12y15E[] = {
  {&(_ZTVN3ccc9FF0x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x12y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x12E__NS_9FF0x12y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x12y15E[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE0x123abcEv,_ZTv0_n12_N3ccc6EE0x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x12y15E = {  "_ZN3ccc9FF0x12y15E", // class name
  bases__ZN3ccc9FF0x12y15E, 2,
  &(vtc__ZN3ccc9FF0x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x12y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x12y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x12y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x12y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y0  : virtual ::ccc::EE0x13 {
  virtual void  abc(); // _ZN3ccc8FF0x13y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y03pqrEv
  ~FF0x13y0(); // tgen
  FF0x13y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y03abcEv");}
void  ccc::FF0x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y03efgEv");}
void  ccc::FF0x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y03pqrEv");}
ccc::FF0x13y0 ::~FF0x13y0(){ note_dtor("_ZN3ccc8FF0x13y0E", this);} // tgen
ccc::FF0x13y0 ::FF0x13y0(){ note_ctor("_ZN3ccc8FF0x13y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y0E, buf);
    ::ccc::FF0x13y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y0E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y0E);
    dp->::ccc::FF0x13y0::~FF0x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y0E(Test__ZN3ccc8FF0x13y0E, "_ZN3ccc8FF0x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y0C1Ev();
extern void _ZN3ccc8FF0x13y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y0E[] = {
  NSPAIR(_ZN3ccc8FF0x13y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y0E[];
extern void _ZN3ccc8FF0x13y03abcEv();
extern void _ZN3ccc8FF0x13y03efgEv();
extern void _ZN3ccc8FF0x13y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y0E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y0E[] = {
  {&(_ZTVN3ccc8FF0x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y0E[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y0E = {  "_ZN3ccc8FF0x13y0E", // class name
  bases__ZN3ccc8FF0x13y0E, 2,
  &(vtc__ZN3ccc8FF0x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y1  : virtual ::ccc::EE0x13 {
  virtual void  abc(); // _ZN3ccc8FF0x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x13y13efgEv
  ~FF0x13y1(); // tgen
  FF0x13y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y13abcEv");}
void  ccc::FF0x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y13pqrEv");}
void  ccc::FF0x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y13efgEv");}
ccc::FF0x13y1 ::~FF0x13y1(){ note_dtor("_ZN3ccc8FF0x13y1E", this);} // tgen
ccc::FF0x13y1 ::FF0x13y1(){ note_ctor("_ZN3ccc8FF0x13y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y1E, buf);
    ::ccc::FF0x13y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y1E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y1E);
    dp->::ccc::FF0x13y1::~FF0x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y1E(Test__ZN3ccc8FF0x13y1E, "_ZN3ccc8FF0x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y1C1Ev();
extern void _ZN3ccc8FF0x13y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y1E[] = {
  NSPAIR(_ZN3ccc8FF0x13y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y1E[];
extern void _ZN3ccc8FF0x13y13abcEv();
extern void _ZN3ccc8FF0x13y13efgEv();
extern void _ZN3ccc8FF0x13y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y1E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y1E[] = {
  {&(_ZTVN3ccc8FF0x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y1E[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y1E = {  "_ZN3ccc8FF0x13y1E", // class name
  bases__ZN3ccc8FF0x13y1E, 2,
  &(vtc__ZN3ccc8FF0x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y2  : virtual ::ccc::EE0x13 {
  virtual void  efg(); // _ZN3ccc8FF0x13y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y23pqrEv
  ~FF0x13y2(); // tgen
  FF0x13y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y23efgEv");}
void  ccc::FF0x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y23abcEv");}
void  ccc::FF0x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y23pqrEv");}
ccc::FF0x13y2 ::~FF0x13y2(){ note_dtor("_ZN3ccc8FF0x13y2E", this);} // tgen
ccc::FF0x13y2 ::FF0x13y2(){ note_ctor("_ZN3ccc8FF0x13y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y2E, buf);
    ::ccc::FF0x13y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y2E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y2E);
    dp->::ccc::FF0x13y2::~FF0x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y2E(Test__ZN3ccc8FF0x13y2E, "_ZN3ccc8FF0x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y2C1Ev();
extern void _ZN3ccc8FF0x13y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y2E[] = {
  NSPAIR(_ZN3ccc8FF0x13y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y2E[];
extern void _ZN3ccc8FF0x13y23abcEv();
extern void _ZN3ccc8FF0x13y23efgEv();
extern void _ZN3ccc8FF0x13y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y2E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y2E[] = {
  {&(_ZTVN3ccc8FF0x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y2E[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y2E = {  "_ZN3ccc8FF0x13y2E", // class name
  bases__ZN3ccc8FF0x13y2E, 2,
  &(vtc__ZN3ccc8FF0x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y3  : virtual ::ccc::EE0x13 {
  virtual void  efg(); // _ZN3ccc8FF0x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x13y33abcEv
  ~FF0x13y3(); // tgen
  FF0x13y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y33efgEv");}
void  ccc::FF0x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y33pqrEv");}
void  ccc::FF0x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y33abcEv");}
ccc::FF0x13y3 ::~FF0x13y3(){ note_dtor("_ZN3ccc8FF0x13y3E", this);} // tgen
ccc::FF0x13y3 ::FF0x13y3(){ note_ctor("_ZN3ccc8FF0x13y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y3E, buf);
    ::ccc::FF0x13y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y3E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y3E);
    dp->::ccc::FF0x13y3::~FF0x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y3E(Test__ZN3ccc8FF0x13y3E, "_ZN3ccc8FF0x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y3C1Ev();
extern void _ZN3ccc8FF0x13y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y3E[] = {
  NSPAIR(_ZN3ccc8FF0x13y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y3E[];
extern void _ZN3ccc8FF0x13y33abcEv();
extern void _ZN3ccc8FF0x13y33efgEv();
extern void _ZN3ccc8FF0x13y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y3E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y3E[] = {
  {&(_ZTVN3ccc8FF0x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y3E[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y3E = {  "_ZN3ccc8FF0x13y3E", // class name
  bases__ZN3ccc8FF0x13y3E, 2,
  &(vtc__ZN3ccc8FF0x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y4  : virtual ::ccc::EE0x13 {
  virtual void  pqr(); // _ZN3ccc8FF0x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x13y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x13y43efgEv
  ~FF0x13y4(); // tgen
  FF0x13y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y43pqrEv");}
void  ccc::FF0x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y43abcEv");}
void  ccc::FF0x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y43efgEv");}
ccc::FF0x13y4 ::~FF0x13y4(){ note_dtor("_ZN3ccc8FF0x13y4E", this);} // tgen
ccc::FF0x13y4 ::FF0x13y4(){ note_ctor("_ZN3ccc8FF0x13y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y4E, buf);
    ::ccc::FF0x13y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y4E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y4E);
    dp->::ccc::FF0x13y4::~FF0x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y4E(Test__ZN3ccc8FF0x13y4E, "_ZN3ccc8FF0x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y4C1Ev();
extern void _ZN3ccc8FF0x13y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y4E[] = {
  NSPAIR(_ZN3ccc8FF0x13y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y4E[];
extern void _ZN3ccc8FF0x13y43abcEv();
extern void _ZN3ccc8FF0x13y43efgEv();
extern void _ZN3ccc8FF0x13y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y4E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y4E[] = {
  {&(_ZTVN3ccc8FF0x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y4E[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y4E = {  "_ZN3ccc8FF0x13y4E", // class name
  bases__ZN3ccc8FF0x13y4E, 2,
  &(vtc__ZN3ccc8FF0x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y5  : virtual ::ccc::EE0x13 {
  virtual void  pqr(); // _ZN3ccc8FF0x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x13y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x13y53abcEv
  ~FF0x13y5(); // tgen
  FF0x13y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y53pqrEv");}
void  ccc::FF0x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y53efgEv");}
void  ccc::FF0x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y53abcEv");}
ccc::FF0x13y5 ::~FF0x13y5(){ note_dtor("_ZN3ccc8FF0x13y5E", this);} // tgen
ccc::FF0x13y5 ::FF0x13y5(){ note_ctor("_ZN3ccc8FF0x13y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y5E, buf);
    ::ccc::FF0x13y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y5E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y5E);
    dp->::ccc::FF0x13y5::~FF0x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y5E(Test__ZN3ccc8FF0x13y5E, "_ZN3ccc8FF0x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y5C1Ev();
extern void _ZN3ccc8FF0x13y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y5E[] = {
  NSPAIR(_ZN3ccc8FF0x13y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y5E[];
extern void _ZN3ccc8FF0x13y53abcEv();
extern void _ZN3ccc8FF0x13y53efgEv();
extern void _ZN3ccc8FF0x13y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y5E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y5E[] = {
  {&(_ZTVN3ccc8FF0x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y5E[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y5E = {  "_ZN3ccc8FF0x13y5E", // class name
  bases__ZN3ccc8FF0x13y5E, 2,
  &(vtc__ZN3ccc8FF0x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y6  : virtual ::ccc::EE0x13 {
  virtual void  abc(); // _ZN3ccc8FF0x13y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x13y63efgEv
  ~FF0x13y6(); // tgen
  FF0x13y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y63abcEv");}
void  ccc::FF0x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y63efgEv");}
ccc::FF0x13y6 ::~FF0x13y6(){ note_dtor("_ZN3ccc8FF0x13y6E", this);} // tgen
ccc::FF0x13y6 ::FF0x13y6(){ note_ctor("_ZN3ccc8FF0x13y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y6E, buf);
    ::ccc::FF0x13y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y6E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y6E);
    dp->::ccc::FF0x13y6::~FF0x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y6E(Test__ZN3ccc8FF0x13y6E, "_ZN3ccc8FF0x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y6C1Ev();
extern void _ZN3ccc8FF0x13y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y6E[] = {
  NSPAIR(_ZN3ccc8FF0x13y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y6E[];
extern void _ZN3ccc8FF0x13y63abcEv();
extern void _ZN3ccc8FF0x13y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y6E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y6E[] = {
  {&(_ZTVN3ccc8FF0x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y6E[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y6E = {  "_ZN3ccc8FF0x13y6E", // class name
  bases__ZN3ccc8FF0x13y6E, 2,
  &(vtc__ZN3ccc8FF0x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y7  : virtual ::ccc::EE0x13 {
  virtual void  abc(); // _ZN3ccc8FF0x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y73pqrEv
  ~FF0x13y7(); // tgen
  FF0x13y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y73abcEv");}
void  ccc::FF0x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y73pqrEv");}
ccc::FF0x13y7 ::~FF0x13y7(){ note_dtor("_ZN3ccc8FF0x13y7E", this);} // tgen
ccc::FF0x13y7 ::FF0x13y7(){ note_ctor("_ZN3ccc8FF0x13y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y7E, buf);
    ::ccc::FF0x13y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y7E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y7E);
    dp->::ccc::FF0x13y7::~FF0x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y7E(Test__ZN3ccc8FF0x13y7E, "_ZN3ccc8FF0x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y7C1Ev();
extern void _ZN3ccc8FF0x13y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y7E[] = {
  NSPAIR(_ZN3ccc8FF0x13y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y7E[];
extern void _ZN3ccc8FF0x13y73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc8FF0x13y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y7E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y7E[] = {
  {&(_ZTVN3ccc8FF0x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y7E[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y7E = {  "_ZN3ccc8FF0x13y7E", // class name
  bases__ZN3ccc8FF0x13y7E, 2,
  &(vtc__ZN3ccc8FF0x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y8  : virtual ::ccc::EE0x13 {
  virtual void  efg(); // _ZN3ccc8FF0x13y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x13y83abcEv
  ~FF0x13y8(); // tgen
  FF0x13y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y83efgEv");}
void  ccc::FF0x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x13y83abcEv");}
ccc::FF0x13y8 ::~FF0x13y8(){ note_dtor("_ZN3ccc8FF0x13y8E", this);} // tgen
ccc::FF0x13y8 ::FF0x13y8(){ note_ctor("_ZN3ccc8FF0x13y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y8E, buf);
    ::ccc::FF0x13y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y8E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y8E);
    dp->::ccc::FF0x13y8::~FF0x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y8E(Test__ZN3ccc8FF0x13y8E, "_ZN3ccc8FF0x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y8C1Ev();
extern void _ZN3ccc8FF0x13y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y8E[] = {
  NSPAIR(_ZN3ccc8FF0x13y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y8E[];
extern void _ZN3ccc8FF0x13y83abcEv();
extern void _ZN3ccc8FF0x13y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y8E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y8E[] = {
  {&(_ZTVN3ccc8FF0x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y8E[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y8E = {  "_ZN3ccc8FF0x13y8E", // class name
  bases__ZN3ccc8FF0x13y8E, 2,
  &(vtc__ZN3ccc8FF0x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y9  : virtual ::ccc::EE0x13 {
  virtual void  efg(); // _ZN3ccc8FF0x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x13y93pqrEv
  ~FF0x13y9(); // tgen
  FF0x13y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x13y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x13y93efgEv");}
void  ccc::FF0x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x13y93pqrEv");}
ccc::FF0x13y9 ::~FF0x13y9(){ note_dtor("_ZN3ccc8FF0x13y9E", this);} // tgen
ccc::FF0x13y9 ::FF0x13y9(){ note_ctor("_ZN3ccc8FF0x13y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x13y9E, buf);
    ::ccc::FF0x13y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x13y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y9E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc8FF0x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x13y9E);
    dp->::ccc::FF0x13y9::~FF0x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x13y9E(Test__ZN3ccc8FF0x13y9E, "_ZN3ccc8FF0x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x13y9C1Ev();
extern void _ZN3ccc8FF0x13y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x13y9E[] = {
  NSPAIR(_ZN3ccc8FF0x13y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc8FF0x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x13y93efgEv();
extern void _ZN3ccc8FF0x13y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x13y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x13y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x13y9E[] = {
  {&(_ZTVN3ccc8FF0x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x13y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_8FF0x13y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x13y9E[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x13y9E = {  "_ZN3ccc8FF0x13y9E", // class name
  bases__ZN3ccc8FF0x13y9E, 2,
  &(vtc__ZN3ccc8FF0x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x13y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x13y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x13y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x13y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y10  : virtual ::ccc::EE0x13 {
  virtual void  pqr(); // _ZN3ccc9FF0x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x13y103abcEv
  ~FF0x13y10(); // tgen
  FF0x13y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x13y103pqrEv");}
void  ccc::FF0x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x13y103abcEv");}
ccc::FF0x13y10 ::~FF0x13y10(){ note_dtor("_ZN3ccc9FF0x13y10E", this);} // tgen
ccc::FF0x13y10 ::FF0x13y10(){ note_ctor("_ZN3ccc9FF0x13y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y10E, buf);
    ::ccc::FF0x13y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y10E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y10E);
    dp->::ccc::FF0x13y10::~FF0x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y10E(Test__ZN3ccc9FF0x13y10E, "_ZN3ccc9FF0x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y10C1Ev();
extern void _ZN3ccc9FF0x13y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y10E[] = {
  NSPAIR(_ZN3ccc9FF0x13y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y10E[];
extern void _ZN3ccc9FF0x13y103abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF0x13y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y10E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y10E[] = {
  {&(_ZTVN3ccc9FF0x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y10E[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y10E = {  "_ZN3ccc9FF0x13y10E", // class name
  bases__ZN3ccc9FF0x13y10E, 2,
  &(vtc__ZN3ccc9FF0x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y11  : virtual ::ccc::EE0x13 {
  virtual void  pqr(); // _ZN3ccc9FF0x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x13y113efgEv
  ~FF0x13y11(); // tgen
  FF0x13y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x13y113pqrEv");}
void  ccc::FF0x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x13y113efgEv");}
ccc::FF0x13y11 ::~FF0x13y11(){ note_dtor("_ZN3ccc9FF0x13y11E", this);} // tgen
ccc::FF0x13y11 ::FF0x13y11(){ note_ctor("_ZN3ccc9FF0x13y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y11E, buf);
    ::ccc::FF0x13y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y11E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y11E);
    dp->::ccc::FF0x13y11::~FF0x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y11E(Test__ZN3ccc9FF0x13y11E, "_ZN3ccc9FF0x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y11C1Ev();
extern void _ZN3ccc9FF0x13y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y11E[] = {
  NSPAIR(_ZN3ccc9FF0x13y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x13y113efgEv();
extern void _ZN3ccc9FF0x13y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y11E[] = {
  {&(_ZTVN3ccc9FF0x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y11E[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y11E = {  "_ZN3ccc9FF0x13y11E", // class name
  bases__ZN3ccc9FF0x13y11E, 2,
  &(vtc__ZN3ccc9FF0x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y12  : virtual ::ccc::EE0x13 {
  virtual void  abc(); // _ZN3ccc9FF0x13y123abcEv
  ~FF0x13y12(); // tgen
  FF0x13y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF0x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x13y123abcEv");}
ccc::FF0x13y12 ::~FF0x13y12(){ note_dtor("_ZN3ccc9FF0x13y12E", this);} // tgen
ccc::FF0x13y12 ::FF0x13y12(){ note_ctor("_ZN3ccc9FF0x13y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y12E, buf);
    ::ccc::FF0x13y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y12E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y12E);
    dp->::ccc::FF0x13y12::~FF0x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y12E(Test__ZN3ccc9FF0x13y12E, "_ZN3ccc9FF0x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y12C1Ev();
extern void _ZN3ccc9FF0x13y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y12E[] = {
  NSPAIR(_ZN3ccc9FF0x13y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y12E[];
extern void _ZN3ccc9FF0x13y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y12E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y12E[] = {
  {&(_ZTVN3ccc9FF0x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y12E[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y12E = {  "_ZN3ccc9FF0x13y12E", // class name
  bases__ZN3ccc9FF0x13y12E, 2,
  &(vtc__ZN3ccc9FF0x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y12E),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
namespace ccc { 
struct  FF0x13y13  : virtual ::ccc::EE0x13 {
  virtual void  efg(); // _ZN3ccc9FF0x13y133efgEv
  ~FF0x13y13(); // tgen
  FF0x13y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y13E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF0x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x13y133efgEv");}
ccc::FF0x13y13 ::~FF0x13y13(){ note_dtor("_ZN3ccc9FF0x13y13E", this);} // tgen
ccc::FF0x13y13 ::FF0x13y13(){ note_ctor("_ZN3ccc9FF0x13y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y13E, buf);
    ::ccc::FF0x13y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y13E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y13E);
    dp->::ccc::FF0x13y13::~FF0x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y13E(Test__ZN3ccc9FF0x13y13E, "_ZN3ccc9FF0x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y13C1Ev();
extern void _ZN3ccc9FF0x13y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y13E[] = {
  NSPAIR(_ZN3ccc9FF0x13y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x13y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y13E[] = {
  {&(_ZTVN3ccc9FF0x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y13E[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y13E = {  "_ZN3ccc9FF0x13y13E", // class name
  bases__ZN3ccc9FF0x13y13E, 2,
  &(vtc__ZN3ccc9FF0x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y14  : virtual ::ccc::EE0x13 {
  virtual void  pqr(); // _ZN3ccc9FF0x13y143pqrEv
  ~FF0x13y14(); // tgen
  FF0x13y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF0x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x13y143pqrEv");}
ccc::FF0x13y14 ::~FF0x13y14(){ note_dtor("_ZN3ccc9FF0x13y14E", this);} // tgen
ccc::FF0x13y14 ::FF0x13y14(){ note_ctor("_ZN3ccc9FF0x13y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y14E, buf);
    ::ccc::FF0x13y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y14E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y14E);
    dp->::ccc::FF0x13y14::~FF0x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y14E(Test__ZN3ccc9FF0x13y14E, "_ZN3ccc9FF0x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y14C1Ev();
extern void _ZN3ccc9FF0x13y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y14E[] = {
  NSPAIR(_ZN3ccc9FF0x13y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF0x13y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF0x13y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y14E[] = {
  {&(_ZTVN3ccc9FF0x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y14E[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y14E = {  "_ZN3ccc9FF0x13y14E", // class name
  bases__ZN3ccc9FF0x13y14E, 2,
  &(vtc__ZN3ccc9FF0x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x13y15  : virtual ::ccc::EE0x13 {
  ~FF0x13y15(); // tgen
  FF0x13y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x13y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1}}
}
namespace ccc { 
ccc::FF0x13y15 ::~FF0x13y15(){ note_dtor("_ZN3ccc9FF0x13y15E", this);} // tgen
ccc::FF0x13y15 ::FF0x13y15(){ note_ctor("_ZN3ccc9FF0x13y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x13y15E, buf);
    ::ccc::FF0x13y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x13y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y15E");
    check_base_class_offset(lv, (::ccc::EE0x13*), 0, "_ZN3ccc9FF0x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x13y15E);
    dp->::ccc::FF0x13y15::~FF0x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x13y15E(Test__ZN3ccc9FF0x13y15E, "_ZN3ccc9FF0x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x13y15C1Ev();
extern void _ZN3ccc9FF0x13y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x13y15E[] = {
  NSPAIR(_ZN3ccc9FF0x13y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x13E[];
static Base_Class bases__ZN3ccc9FF0x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x13y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv)();
extern void _ZN3ccc6EE0x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x13y15E[] = {
  {&(_ZTVN3ccc9FF0x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x13y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x13E__NS_9FF0x13y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x13y15E[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE0x133efgEv,_ZTv0_n16_N3ccc6EE0x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x13y15E = {  "_ZN3ccc9FF0x13y15E", // class name
  bases__ZN3ccc9FF0x13y15E, 2,
  &(vtc__ZN3ccc9FF0x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x13y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x13y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x13y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x13y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y0  : virtual ::ccc::EE0x14 {
  virtual void  abc(); // _ZN3ccc8FF0x14y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y03pqrEv
  ~FF0x14y0(); // tgen
  FF0x14y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y0E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y03abcEv");}
void  ccc::FF0x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y03efgEv");}
void  ccc::FF0x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y03pqrEv");}
ccc::FF0x14y0 ::~FF0x14y0(){ note_dtor("_ZN3ccc8FF0x14y0E", this);} // tgen
ccc::FF0x14y0 ::FF0x14y0(){ note_ctor("_ZN3ccc8FF0x14y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y0E, buf);
    ::ccc::FF0x14y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y0E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y0E);
    dp->::ccc::FF0x14y0::~FF0x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y0E(Test__ZN3ccc8FF0x14y0E, "_ZN3ccc8FF0x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y0C1Ev();
extern void _ZN3ccc8FF0x14y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y0E[] = {
  NSPAIR(_ZN3ccc8FF0x14y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y0E[];
extern void _ZN3ccc8FF0x14y03abcEv();
extern void _ZN3ccc8FF0x14y03efgEv();
extern void _ZN3ccc8FF0x14y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y0E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y0E[] = {
  {&(_ZTVN3ccc8FF0x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y0E[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y0E = {  "_ZN3ccc8FF0x14y0E", // class name
  bases__ZN3ccc8FF0x14y0E, 2,
  &(vtc__ZN3ccc8FF0x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y1  : virtual ::ccc::EE0x14 {
  virtual void  abc(); // _ZN3ccc8FF0x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x14y13efgEv
  ~FF0x14y1(); // tgen
  FF0x14y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y1E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y13abcEv");}
void  ccc::FF0x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y13pqrEv");}
void  ccc::FF0x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y13efgEv");}
ccc::FF0x14y1 ::~FF0x14y1(){ note_dtor("_ZN3ccc8FF0x14y1E", this);} // tgen
ccc::FF0x14y1 ::FF0x14y1(){ note_ctor("_ZN3ccc8FF0x14y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y1E, buf);
    ::ccc::FF0x14y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y1E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y1E);
    dp->::ccc::FF0x14y1::~FF0x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y1E(Test__ZN3ccc8FF0x14y1E, "_ZN3ccc8FF0x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y1C1Ev();
extern void _ZN3ccc8FF0x14y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y1E[] = {
  NSPAIR(_ZN3ccc8FF0x14y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y1E[];
extern void _ZN3ccc8FF0x14y13abcEv();
extern void _ZN3ccc8FF0x14y13efgEv();
extern void _ZN3ccc8FF0x14y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y1E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y1E[] = {
  {&(_ZTVN3ccc8FF0x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y1E[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y1E = {  "_ZN3ccc8FF0x14y1E", // class name
  bases__ZN3ccc8FF0x14y1E, 2,
  &(vtc__ZN3ccc8FF0x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y2  : virtual ::ccc::EE0x14 {
  virtual void  efg(); // _ZN3ccc8FF0x14y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y23pqrEv
  ~FF0x14y2(); // tgen
  FF0x14y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y2E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y23efgEv");}
void  ccc::FF0x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y23abcEv");}
void  ccc::FF0x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y23pqrEv");}
ccc::FF0x14y2 ::~FF0x14y2(){ note_dtor("_ZN3ccc8FF0x14y2E", this);} // tgen
ccc::FF0x14y2 ::FF0x14y2(){ note_ctor("_ZN3ccc8FF0x14y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y2E, buf);
    ::ccc::FF0x14y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y2E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y2E);
    dp->::ccc::FF0x14y2::~FF0x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y2E(Test__ZN3ccc8FF0x14y2E, "_ZN3ccc8FF0x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y2C1Ev();
extern void _ZN3ccc8FF0x14y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y2E[] = {
  NSPAIR(_ZN3ccc8FF0x14y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y2E[];
extern void _ZN3ccc8FF0x14y23abcEv();
extern void _ZN3ccc8FF0x14y23efgEv();
extern void _ZN3ccc8FF0x14y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y2E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y2E[] = {
  {&(_ZTVN3ccc8FF0x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y2E[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y2E = {  "_ZN3ccc8FF0x14y2E", // class name
  bases__ZN3ccc8FF0x14y2E, 2,
  &(vtc__ZN3ccc8FF0x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y3  : virtual ::ccc::EE0x14 {
  virtual void  efg(); // _ZN3ccc8FF0x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x14y33abcEv
  ~FF0x14y3(); // tgen
  FF0x14y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y3E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y33efgEv");}
void  ccc::FF0x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y33pqrEv");}
void  ccc::FF0x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y33abcEv");}
ccc::FF0x14y3 ::~FF0x14y3(){ note_dtor("_ZN3ccc8FF0x14y3E", this);} // tgen
ccc::FF0x14y3 ::FF0x14y3(){ note_ctor("_ZN3ccc8FF0x14y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y3E, buf);
    ::ccc::FF0x14y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y3E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y3E);
    dp->::ccc::FF0x14y3::~FF0x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y3E(Test__ZN3ccc8FF0x14y3E, "_ZN3ccc8FF0x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y3C1Ev();
extern void _ZN3ccc8FF0x14y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y3E[] = {
  NSPAIR(_ZN3ccc8FF0x14y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y3E[];
extern void _ZN3ccc8FF0x14y33abcEv();
extern void _ZN3ccc8FF0x14y33efgEv();
extern void _ZN3ccc8FF0x14y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y3E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y3E[] = {
  {&(_ZTVN3ccc8FF0x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y3E[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y3E = {  "_ZN3ccc8FF0x14y3E", // class name
  bases__ZN3ccc8FF0x14y3E, 2,
  &(vtc__ZN3ccc8FF0x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y4  : virtual ::ccc::EE0x14 {
  virtual void  pqr(); // _ZN3ccc8FF0x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x14y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x14y43efgEv
  ~FF0x14y4(); // tgen
  FF0x14y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y4E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y43pqrEv");}
void  ccc::FF0x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y43abcEv");}
void  ccc::FF0x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y43efgEv");}
ccc::FF0x14y4 ::~FF0x14y4(){ note_dtor("_ZN3ccc8FF0x14y4E", this);} // tgen
ccc::FF0x14y4 ::FF0x14y4(){ note_ctor("_ZN3ccc8FF0x14y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y4E, buf);
    ::ccc::FF0x14y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y4E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y4E);
    dp->::ccc::FF0x14y4::~FF0x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y4E(Test__ZN3ccc8FF0x14y4E, "_ZN3ccc8FF0x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y4C1Ev();
extern void _ZN3ccc8FF0x14y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y4E[] = {
  NSPAIR(_ZN3ccc8FF0x14y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y4E[];
extern void _ZN3ccc8FF0x14y43abcEv();
extern void _ZN3ccc8FF0x14y43efgEv();
extern void _ZN3ccc8FF0x14y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y4E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y4E[] = {
  {&(_ZTVN3ccc8FF0x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y4E[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y4E = {  "_ZN3ccc8FF0x14y4E", // class name
  bases__ZN3ccc8FF0x14y4E, 2,
  &(vtc__ZN3ccc8FF0x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names229,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y5  : virtual ::ccc::EE0x14 {
  virtual void  pqr(); // _ZN3ccc8FF0x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x14y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x14y53abcEv
  ~FF0x14y5(); // tgen
  FF0x14y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y5E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y53pqrEv");}
void  ccc::FF0x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y53efgEv");}
void  ccc::FF0x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y53abcEv");}
ccc::FF0x14y5 ::~FF0x14y5(){ note_dtor("_ZN3ccc8FF0x14y5E", this);} // tgen
ccc::FF0x14y5 ::FF0x14y5(){ note_ctor("_ZN3ccc8FF0x14y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y5E, buf);
    ::ccc::FF0x14y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y5E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y5E);
    dp->::ccc::FF0x14y5::~FF0x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y5E(Test__ZN3ccc8FF0x14y5E, "_ZN3ccc8FF0x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y5C1Ev();
extern void _ZN3ccc8FF0x14y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y5E[] = {
  NSPAIR(_ZN3ccc8FF0x14y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y5E[];
extern void _ZN3ccc8FF0x14y53abcEv();
extern void _ZN3ccc8FF0x14y53efgEv();
extern void _ZN3ccc8FF0x14y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y5E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y5E[] = {
  {&(_ZTVN3ccc8FF0x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y5E[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y5E = {  "_ZN3ccc8FF0x14y5E", // class name
  bases__ZN3ccc8FF0x14y5E, 2,
  &(vtc__ZN3ccc8FF0x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names230,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y6  : virtual ::ccc::EE0x14 {
  virtual void  abc(); // _ZN3ccc8FF0x14y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x14y63efgEv
  ~FF0x14y6(); // tgen
  FF0x14y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y6E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y63abcEv");}
void  ccc::FF0x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y63efgEv");}
ccc::FF0x14y6 ::~FF0x14y6(){ note_dtor("_ZN3ccc8FF0x14y6E", this);} // tgen
ccc::FF0x14y6 ::FF0x14y6(){ note_ctor("_ZN3ccc8FF0x14y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y6E, buf);
    ::ccc::FF0x14y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y6E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y6E);
    dp->::ccc::FF0x14y6::~FF0x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y6E(Test__ZN3ccc8FF0x14y6E, "_ZN3ccc8FF0x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y6C1Ev();
extern void _ZN3ccc8FF0x14y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y6E[] = {
  NSPAIR(_ZN3ccc8FF0x14y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y6E[];
extern void _ZN3ccc8FF0x14y63abcEv();
extern void _ZN3ccc8FF0x14y63efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y6E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y6E[] = {
  {&(_ZTVN3ccc8FF0x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y6E[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y6E = {  "_ZN3ccc8FF0x14y6E", // class name
  bases__ZN3ccc8FF0x14y6E, 2,
  &(vtc__ZN3ccc8FF0x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names231,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y7  : virtual ::ccc::EE0x14 {
  virtual void  abc(); // _ZN3ccc8FF0x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y73pqrEv
  ~FF0x14y7(); // tgen
  FF0x14y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y7E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y73abcEv");}
void  ccc::FF0x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y73pqrEv");}
ccc::FF0x14y7 ::~FF0x14y7(){ note_dtor("_ZN3ccc8FF0x14y7E", this);} // tgen
ccc::FF0x14y7 ::FF0x14y7(){ note_ctor("_ZN3ccc8FF0x14y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y7E, buf);
    ::ccc::FF0x14y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y7E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y7E);
    dp->::ccc::FF0x14y7::~FF0x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y7E(Test__ZN3ccc8FF0x14y7E, "_ZN3ccc8FF0x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y7C1Ev();
extern void _ZN3ccc8FF0x14y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y7E[] = {
  NSPAIR(_ZN3ccc8FF0x14y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y7E[];
extern void _ZN3ccc8FF0x14y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x14y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y7E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y7E[] = {
  {&(_ZTVN3ccc8FF0x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y7E[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y7E = {  "_ZN3ccc8FF0x14y7E", // class name
  bases__ZN3ccc8FF0x14y7E, 2,
  &(vtc__ZN3ccc8FF0x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names232,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y8  : virtual ::ccc::EE0x14 {
  virtual void  efg(); // _ZN3ccc8FF0x14y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x14y83abcEv
  ~FF0x14y8(); // tgen
  FF0x14y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y8E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y83efgEv");}
void  ccc::FF0x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x14y83abcEv");}
ccc::FF0x14y8 ::~FF0x14y8(){ note_dtor("_ZN3ccc8FF0x14y8E", this);} // tgen
ccc::FF0x14y8 ::FF0x14y8(){ note_ctor("_ZN3ccc8FF0x14y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y8E, buf);
    ::ccc::FF0x14y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y8E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y8E);
    dp->::ccc::FF0x14y8::~FF0x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y8E(Test__ZN3ccc8FF0x14y8E, "_ZN3ccc8FF0x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y8C1Ev();
extern void _ZN3ccc8FF0x14y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y8E[] = {
  NSPAIR(_ZN3ccc8FF0x14y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y8E[];
extern void _ZN3ccc8FF0x14y83abcEv();
extern void _ZN3ccc8FF0x14y83efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y8E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y8E[] = {
  {&(_ZTVN3ccc8FF0x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y8E[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y8E = {  "_ZN3ccc8FF0x14y8E", // class name
  bases__ZN3ccc8FF0x14y8E, 2,
  &(vtc__ZN3ccc8FF0x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names233,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y9  : virtual ::ccc::EE0x14 {
  virtual void  efg(); // _ZN3ccc8FF0x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x14y93pqrEv
  ~FF0x14y9(); // tgen
  FF0x14y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x14y9E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x14y93efgEv");}
void  ccc::FF0x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x14y93pqrEv");}
ccc::FF0x14y9 ::~FF0x14y9(){ note_dtor("_ZN3ccc8FF0x14y9E", this);} // tgen
ccc::FF0x14y9 ::FF0x14y9(){ note_ctor("_ZN3ccc8FF0x14y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x14y9E, buf);
    ::ccc::FF0x14y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x14y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y9E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc8FF0x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x14y9E);
    dp->::ccc::FF0x14y9::~FF0x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x14y9E(Test__ZN3ccc8FF0x14y9E, "_ZN3ccc8FF0x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x14y9C1Ev();
extern void _ZN3ccc8FF0x14y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x14y9E[] = {
  NSPAIR(_ZN3ccc8FF0x14y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc8FF0x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x14y93efgEv();
extern void _ZN3ccc8FF0x14y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x14y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x14y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x14y9E[] = {
  {&(_ZTVN3ccc8FF0x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x14y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_8FF0x14y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x14y9E[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF0x14y9E = {  "_ZN3ccc8FF0x14y9E", // class name
  bases__ZN3ccc8FF0x14y9E, 2,
  &(vtc__ZN3ccc8FF0x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x14y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x14y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x14y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x14y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y10  : virtual ::ccc::EE0x14 {
  virtual void  pqr(); // _ZN3ccc9FF0x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x14y103abcEv
  ~FF0x14y10(); // tgen
  FF0x14y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y10E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x14y103pqrEv");}
void  ccc::FF0x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x14y103abcEv");}
ccc::FF0x14y10 ::~FF0x14y10(){ note_dtor("_ZN3ccc9FF0x14y10E", this);} // tgen
ccc::FF0x14y10 ::FF0x14y10(){ note_ctor("_ZN3ccc9FF0x14y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y10E, buf);
    ::ccc::FF0x14y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y10E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y10E);
    dp->::ccc::FF0x14y10::~FF0x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y10E(Test__ZN3ccc9FF0x14y10E, "_ZN3ccc9FF0x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y10C1Ev();
extern void _ZN3ccc9FF0x14y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y10E[] = {
  NSPAIR(_ZN3ccc9FF0x14y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y10E[];
extern void _ZN3ccc9FF0x14y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x14y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y10E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y10E[] = {
  {&(_ZTVN3ccc9FF0x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y10E[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y10E = {  "_ZN3ccc9FF0x14y10E", // class name
  bases__ZN3ccc9FF0x14y10E, 2,
  &(vtc__ZN3ccc9FF0x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y11  : virtual ::ccc::EE0x14 {
  virtual void  pqr(); // _ZN3ccc9FF0x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x14y113efgEv
  ~FF0x14y11(); // tgen
  FF0x14y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y11E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF0x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x14y113pqrEv");}
void  ccc::FF0x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x14y113efgEv");}
ccc::FF0x14y11 ::~FF0x14y11(){ note_dtor("_ZN3ccc9FF0x14y11E", this);} // tgen
ccc::FF0x14y11 ::FF0x14y11(){ note_ctor("_ZN3ccc9FF0x14y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y11E, buf);
    ::ccc::FF0x14y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y11E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y11E);
    dp->::ccc::FF0x14y11::~FF0x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y11E(Test__ZN3ccc9FF0x14y11E, "_ZN3ccc9FF0x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y11C1Ev();
extern void _ZN3ccc9FF0x14y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y11E[] = {
  NSPAIR(_ZN3ccc9FF0x14y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x14y113efgEv();
extern void _ZN3ccc9FF0x14y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y11E[] = {
  {&(_ZTVN3ccc9FF0x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y11E[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y11E = {  "_ZN3ccc9FF0x14y11E", // class name
  bases__ZN3ccc9FF0x14y11E, 2,
  &(vtc__ZN3ccc9FF0x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y12  : virtual ::ccc::EE0x14 {
  virtual void  abc(); // _ZN3ccc9FF0x14y123abcEv
  ~FF0x14y12(); // tgen
  FF0x14y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF0x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x14y123abcEv");}
ccc::FF0x14y12 ::~FF0x14y12(){ note_dtor("_ZN3ccc9FF0x14y12E", this);} // tgen
ccc::FF0x14y12 ::FF0x14y12(){ note_ctor("_ZN3ccc9FF0x14y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y12E, buf);
    ::ccc::FF0x14y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y12E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y12E);
    dp->::ccc::FF0x14y12::~FF0x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y12E(Test__ZN3ccc9FF0x14y12E, "_ZN3ccc9FF0x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y12C1Ev();
extern void _ZN3ccc9FF0x14y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y12E[] = {
  NSPAIR(_ZN3ccc9FF0x14y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y12E[];
extern void _ZN3ccc9FF0x14y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y12E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y12E[] = {
  {&(_ZTVN3ccc9FF0x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y12E[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y12E = {  "_ZN3ccc9FF0x14y12E", // class name
  bases__ZN3ccc9FF0x14y12E, 2,
  &(vtc__ZN3ccc9FF0x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y13  : virtual ::ccc::EE0x14 {
  virtual void  efg(); // _ZN3ccc9FF0x14y133efgEv
  ~FF0x14y13(); // tgen
  FF0x14y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y13E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF0x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x14y133efgEv");}
ccc::FF0x14y13 ::~FF0x14y13(){ note_dtor("_ZN3ccc9FF0x14y13E", this);} // tgen
ccc::FF0x14y13 ::FF0x14y13(){ note_ctor("_ZN3ccc9FF0x14y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y13E, buf);
    ::ccc::FF0x14y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y13E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y13E);
    dp->::ccc::FF0x14y13::~FF0x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y13E(Test__ZN3ccc9FF0x14y13E, "_ZN3ccc9FF0x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y13C1Ev();
extern void _ZN3ccc9FF0x14y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y13E[] = {
  NSPAIR(_ZN3ccc9FF0x14y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x14y133efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y13E[] = {
  {&(_ZTVN3ccc9FF0x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y13E[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y13E = {  "_ZN3ccc9FF0x14y13E", // class name
  bases__ZN3ccc9FF0x14y13E, 2,
  &(vtc__ZN3ccc9FF0x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y14  : virtual ::ccc::EE0x14 {
  virtual void  pqr(); // _ZN3ccc9FF0x14y143pqrEv
  ~FF0x14y14(); // tgen
  FF0x14y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1}
}
namespace ccc { 
void  ccc::FF0x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x14y143pqrEv");}
ccc::FF0x14y14 ::~FF0x14y14(){ note_dtor("_ZN3ccc9FF0x14y14E", this);} // tgen
ccc::FF0x14y14 ::FF0x14y14(){ note_ctor("_ZN3ccc9FF0x14y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y14E, buf);
    ::ccc::FF0x14y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y14E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y14E);
    dp->::ccc::FF0x14y14::~FF0x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y14E(Test__ZN3ccc9FF0x14y14E, "_ZN3ccc9FF0x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y14C1Ev();
extern void _ZN3ccc9FF0x14y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y14E[] = {
  NSPAIR(_ZN3ccc9FF0x14y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x14y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x14y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y14E[] = {
  {&(_ZTVN3ccc9FF0x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y14E[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y14E = {  "_ZN3ccc9FF0x14y14E", // class name
  bases__ZN3ccc9FF0x14y14E, 2,
  &(vtc__ZN3ccc9FF0x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x14y15  : virtual ::ccc::EE0x14 {
  ~FF0x14y15(); // tgen
  FF0x14y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x14y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1}}
}
namespace ccc { 
ccc::FF0x14y15 ::~FF0x14y15(){ note_dtor("_ZN3ccc9FF0x14y15E", this);} // tgen
ccc::FF0x14y15 ::FF0x14y15(){ note_ctor("_ZN3ccc9FF0x14y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x14y15E, buf);
    ::ccc::FF0x14y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x14y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y15E");
    check_base_class_offset(lv, (::ccc::EE0x14*), 0, "_ZN3ccc9FF0x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x14y15E);
    dp->::ccc::FF0x14y15::~FF0x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x14y15E(Test__ZN3ccc9FF0x14y15E, "_ZN3ccc9FF0x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x14y15C1Ev();
extern void _ZN3ccc9FF0x14y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x14y15E[] = {
  NSPAIR(_ZN3ccc9FF0x14y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x14E[];
static Base_Class bases__ZN3ccc9FF0x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF0x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x14y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv)();
extern void _ZN3ccc6EE0x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x14y15E[] = {
  {&(_ZTVN3ccc9FF0x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x14y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x14E__NS_9FF0x14y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x14y15E[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE0x143pqrEv,_ZTv0_n20_N3ccc6EE0x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE0x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF0x14y15E = {  "_ZN3ccc9FF0x14y15E", // class name
  bases__ZN3ccc9FF0x14y15E, 2,
  &(vtc__ZN3ccc9FF0x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x14y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x14y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x14y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x14y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF0x15y0  : virtual ::ccc::EE0x15 {
  virtual void  abc(); // _ZN3ccc8FF0x15y03abcEv
  virtual void  efg(); // _ZN3ccc8FF0x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y03pqrEv
  ~FF0x15y0(); // tgen
  FF0x15y0(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y0E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y03abcEv");}
void  ccc::FF0x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y03efgEv");}
void  ccc::FF0x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y03pqrEv");}
ccc::FF0x15y0 ::~FF0x15y0(){ note_dtor("_ZN3ccc8FF0x15y0E", this);} // tgen
ccc::FF0x15y0 ::FF0x15y0(){ note_ctor("_ZN3ccc8FF0x15y0E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y0E, buf);
    ::ccc::FF0x15y0 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y0E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y0E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y0E);
    dp->::ccc::FF0x15y0::~FF0x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y0E(Test__ZN3ccc8FF0x15y0E, "_ZN3ccc8FF0x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y0C1Ev();
extern void _ZN3ccc8FF0x15y0D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y0E[] = {
  NSPAIR(_ZN3ccc8FF0x15y0C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y0E[];
extern void _ZN3ccc8FF0x15y03abcEv();
extern void _ZN3ccc8FF0x15y03efgEv();
extern void _ZN3ccc8FF0x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y0E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y0E[] = {
  {&(_ZTVN3ccc8FF0x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y0E[];
Class_Descriptor cd__ZN3ccc8FF0x15y0E = {  "_ZN3ccc8FF0x15y0E", // class name
  bases__ZN3ccc8FF0x15y0E, 2,
  &(vtc__ZN3ccc8FF0x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y0E),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
namespace ccc { 
struct  FF0x15y1  : virtual ::ccc::EE0x15 {
  virtual void  abc(); // _ZN3ccc8FF0x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x15y13efgEv
  ~FF0x15y1(); // tgen
  FF0x15y1(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y1E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y13abcEv");}
void  ccc::FF0x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y13pqrEv");}
void  ccc::FF0x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y13efgEv");}
ccc::FF0x15y1 ::~FF0x15y1(){ note_dtor("_ZN3ccc8FF0x15y1E", this);} // tgen
ccc::FF0x15y1 ::FF0x15y1(){ note_ctor("_ZN3ccc8FF0x15y1E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y1E, buf);
    ::ccc::FF0x15y1 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y1E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y1E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y1E);
    dp->::ccc::FF0x15y1::~FF0x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y1E(Test__ZN3ccc8FF0x15y1E, "_ZN3ccc8FF0x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y1C1Ev();
extern void _ZN3ccc8FF0x15y1D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y1E[] = {
  NSPAIR(_ZN3ccc8FF0x15y1C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y1E[];
extern void _ZN3ccc8FF0x15y13abcEv();
extern void _ZN3ccc8FF0x15y13efgEv();
extern void _ZN3ccc8FF0x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y1E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y1E[] = {
  {&(_ZTVN3ccc8FF0x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y1E[];
Class_Descriptor cd__ZN3ccc8FF0x15y1E = {  "_ZN3ccc8FF0x15y1E", // class name
  bases__ZN3ccc8FF0x15y1E, 2,
  &(vtc__ZN3ccc8FF0x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y1E),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
namespace ccc { 
struct  FF0x15y2  : virtual ::ccc::EE0x15 {
  virtual void  efg(); // _ZN3ccc8FF0x15y23efgEv
  virtual void  abc(); // _ZN3ccc8FF0x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y23pqrEv
  ~FF0x15y2(); // tgen
  FF0x15y2(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y2E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y23efgEv");}
void  ccc::FF0x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y23abcEv");}
void  ccc::FF0x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y23pqrEv");}
ccc::FF0x15y2 ::~FF0x15y2(){ note_dtor("_ZN3ccc8FF0x15y2E", this);} // tgen
ccc::FF0x15y2 ::FF0x15y2(){ note_ctor("_ZN3ccc8FF0x15y2E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y2E, buf);
    ::ccc::FF0x15y2 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y2E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y2E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y2E);
    dp->::ccc::FF0x15y2::~FF0x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y2E(Test__ZN3ccc8FF0x15y2E, "_ZN3ccc8FF0x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y2C1Ev();
extern void _ZN3ccc8FF0x15y2D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y2E[] = {
  NSPAIR(_ZN3ccc8FF0x15y2C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y2E[];
extern void _ZN3ccc8FF0x15y23abcEv();
extern void _ZN3ccc8FF0x15y23efgEv();
extern void _ZN3ccc8FF0x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y2E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y2E[] = {
  {&(_ZTVN3ccc8FF0x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y2E[];
Class_Descriptor cd__ZN3ccc8FF0x15y2E = {  "_ZN3ccc8FF0x15y2E", // class name
  bases__ZN3ccc8FF0x15y2E, 2,
  &(vtc__ZN3ccc8FF0x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y2E),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
namespace ccc { 
struct  FF0x15y3  : virtual ::ccc::EE0x15 {
  virtual void  efg(); // _ZN3ccc8FF0x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x15y33abcEv
  ~FF0x15y3(); // tgen
  FF0x15y3(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y3E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y33efgEv");}
void  ccc::FF0x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y33pqrEv");}
void  ccc::FF0x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y33abcEv");}
ccc::FF0x15y3 ::~FF0x15y3(){ note_dtor("_ZN3ccc8FF0x15y3E", this);} // tgen
ccc::FF0x15y3 ::FF0x15y3(){ note_ctor("_ZN3ccc8FF0x15y3E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y3E, buf);
    ::ccc::FF0x15y3 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y3E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y3E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y3E);
    dp->::ccc::FF0x15y3::~FF0x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y3E(Test__ZN3ccc8FF0x15y3E, "_ZN3ccc8FF0x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y3C1Ev();
extern void _ZN3ccc8FF0x15y3D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y3E[] = {
  NSPAIR(_ZN3ccc8FF0x15y3C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y3E[];
extern void _ZN3ccc8FF0x15y33abcEv();
extern void _ZN3ccc8FF0x15y33efgEv();
extern void _ZN3ccc8FF0x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y3E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y3E[] = {
  {&(_ZTVN3ccc8FF0x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y3E[];
Class_Descriptor cd__ZN3ccc8FF0x15y3E = {  "_ZN3ccc8FF0x15y3E", // class name
  bases__ZN3ccc8FF0x15y3E, 2,
  &(vtc__ZN3ccc8FF0x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y3E),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
namespace ccc { 
struct  FF0x15y4  : virtual ::ccc::EE0x15 {
  virtual void  pqr(); // _ZN3ccc8FF0x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF0x15y43abcEv
  virtual void  efg(); // _ZN3ccc8FF0x15y43efgEv
  ~FF0x15y4(); // tgen
  FF0x15y4(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y4E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y43pqrEv");}
void  ccc::FF0x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y43abcEv");}
void  ccc::FF0x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y43efgEv");}
ccc::FF0x15y4 ::~FF0x15y4(){ note_dtor("_ZN3ccc8FF0x15y4E", this);} // tgen
ccc::FF0x15y4 ::FF0x15y4(){ note_ctor("_ZN3ccc8FF0x15y4E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y4E, buf);
    ::ccc::FF0x15y4 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y4E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y4E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y4E);
    dp->::ccc::FF0x15y4::~FF0x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y4E(Test__ZN3ccc8FF0x15y4E, "_ZN3ccc8FF0x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y4C1Ev();
extern void _ZN3ccc8FF0x15y4D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y4E[] = {
  NSPAIR(_ZN3ccc8FF0x15y4C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y4E[];
extern void _ZN3ccc8FF0x15y43abcEv();
extern void _ZN3ccc8FF0x15y43efgEv();
extern void _ZN3ccc8FF0x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y4E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y4E[] = {
  {&(_ZTVN3ccc8FF0x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y4E[];
Class_Descriptor cd__ZN3ccc8FF0x15y4E = {  "_ZN3ccc8FF0x15y4E", // class name
  bases__ZN3ccc8FF0x15y4E, 2,
  &(vtc__ZN3ccc8FF0x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y4E),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
namespace ccc { 
struct  FF0x15y5  : virtual ::ccc::EE0x15 {
  virtual void  pqr(); // _ZN3ccc8FF0x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF0x15y53efgEv
  virtual void  abc(); // _ZN3ccc8FF0x15y53abcEv
  ~FF0x15y5(); // tgen
  FF0x15y5(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y5E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF0x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y53pqrEv");}
void  ccc::FF0x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y53efgEv");}
void  ccc::FF0x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y53abcEv");}
ccc::FF0x15y5 ::~FF0x15y5(){ note_dtor("_ZN3ccc8FF0x15y5E", this);} // tgen
ccc::FF0x15y5 ::FF0x15y5(){ note_ctor("_ZN3ccc8FF0x15y5E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y5E, buf);
    ::ccc::FF0x15y5 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y5E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y5E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y5E);
    dp->::ccc::FF0x15y5::~FF0x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y5E(Test__ZN3ccc8FF0x15y5E, "_ZN3ccc8FF0x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y5C1Ev();
extern void _ZN3ccc8FF0x15y5D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y5E[] = {
  NSPAIR(_ZN3ccc8FF0x15y5C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y5E[];
extern void _ZN3ccc8FF0x15y53abcEv();
extern void _ZN3ccc8FF0x15y53efgEv();
extern void _ZN3ccc8FF0x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y5E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y5E[] = {
  {&(_ZTVN3ccc8FF0x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y5E[];
Class_Descriptor cd__ZN3ccc8FF0x15y5E = {  "_ZN3ccc8FF0x15y5E", // class name
  bases__ZN3ccc8FF0x15y5E, 2,
  &(vtc__ZN3ccc8FF0x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y5E),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
namespace ccc { 
struct  FF0x15y6  : virtual ::ccc::EE0x15 {
  virtual void  abc(); // _ZN3ccc8FF0x15y63abcEv
  virtual void  efg(); // _ZN3ccc8FF0x15y63efgEv
  ~FF0x15y6(); // tgen
  FF0x15y6(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y6E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y63abcEv");}
void  ccc::FF0x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y63efgEv");}
ccc::FF0x15y6 ::~FF0x15y6(){ note_dtor("_ZN3ccc8FF0x15y6E", this);} // tgen
ccc::FF0x15y6 ::FF0x15y6(){ note_ctor("_ZN3ccc8FF0x15y6E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y6E, buf);
    ::ccc::FF0x15y6 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y6E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y6E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y6E);
    dp->::ccc::FF0x15y6::~FF0x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y6E(Test__ZN3ccc8FF0x15y6E, "_ZN3ccc8FF0x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y6C1Ev();
extern void _ZN3ccc8FF0x15y6D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y6E[] = {
  NSPAIR(_ZN3ccc8FF0x15y6C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y6E[];
extern void _ZN3ccc8FF0x15y63abcEv();
extern void _ZN3ccc8FF0x15y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y6E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y6E[] = {
  {&(_ZTVN3ccc8FF0x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y6E[];
Class_Descriptor cd__ZN3ccc8FF0x15y6E = {  "_ZN3ccc8FF0x15y6E", // class name
  bases__ZN3ccc8FF0x15y6E, 2,
  &(vtc__ZN3ccc8FF0x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y6E),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
namespace ccc { 
struct  FF0x15y7  : virtual ::ccc::EE0x15 {
  virtual void  abc(); // _ZN3ccc8FF0x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y73pqrEv
  ~FF0x15y7(); // tgen
  FF0x15y7(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y7E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y73abcEv");}
void  ccc::FF0x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y73pqrEv");}
ccc::FF0x15y7 ::~FF0x15y7(){ note_dtor("_ZN3ccc8FF0x15y7E", this);} // tgen
ccc::FF0x15y7 ::FF0x15y7(){ note_ctor("_ZN3ccc8FF0x15y7E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y7E, buf);
    ::ccc::FF0x15y7 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y7E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y7E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y7E);
    dp->::ccc::FF0x15y7::~FF0x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y7E(Test__ZN3ccc8FF0x15y7E, "_ZN3ccc8FF0x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y7C1Ev();
extern void _ZN3ccc8FF0x15y7D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y7E[] = {
  NSPAIR(_ZN3ccc8FF0x15y7C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y7E[];
extern void _ZN3ccc8FF0x15y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8FF0x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y7E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y7E[] = {
  {&(_ZTVN3ccc8FF0x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y7E[];
Class_Descriptor cd__ZN3ccc8FF0x15y7E = {  "_ZN3ccc8FF0x15y7E", // class name
  bases__ZN3ccc8FF0x15y7E, 2,
  &(vtc__ZN3ccc8FF0x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y7E),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
namespace ccc { 
struct  FF0x15y8  : virtual ::ccc::EE0x15 {
  virtual void  efg(); // _ZN3ccc8FF0x15y83efgEv
  virtual void  abc(); // _ZN3ccc8FF0x15y83abcEv
  ~FF0x15y8(); // tgen
  FF0x15y8(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y8E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y83efgEv");}
void  ccc::FF0x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF0x15y83abcEv");}
ccc::FF0x15y8 ::~FF0x15y8(){ note_dtor("_ZN3ccc8FF0x15y8E", this);} // tgen
ccc::FF0x15y8 ::FF0x15y8(){ note_ctor("_ZN3ccc8FF0x15y8E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y8E, buf);
    ::ccc::FF0x15y8 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y8E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y8E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y8E);
    dp->::ccc::FF0x15y8::~FF0x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y8E(Test__ZN3ccc8FF0x15y8E, "_ZN3ccc8FF0x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y8C1Ev();
extern void _ZN3ccc8FF0x15y8D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y8E[] = {
  NSPAIR(_ZN3ccc8FF0x15y8C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y8E[];
extern void _ZN3ccc8FF0x15y83abcEv();
extern void _ZN3ccc8FF0x15y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y8E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y8E[] = {
  {&(_ZTVN3ccc8FF0x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y8E[];
Class_Descriptor cd__ZN3ccc8FF0x15y8E = {  "_ZN3ccc8FF0x15y8E", // class name
  bases__ZN3ccc8FF0x15y8E, 2,
  &(vtc__ZN3ccc8FF0x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y8E),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
namespace ccc { 
struct  FF0x15y9  : virtual ::ccc::EE0x15 {
  virtual void  efg(); // _ZN3ccc8FF0x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF0x15y93pqrEv
  ~FF0x15y9(); // tgen
  FF0x15y9(); // tgen
};
//SIG(1 _ZN3ccc8FF0x15y9E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF0x15y93efgEv");}
void  ccc::FF0x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF0x15y93pqrEv");}
ccc::FF0x15y9 ::~FF0x15y9(){ note_dtor("_ZN3ccc8FF0x15y9E", this);} // tgen
ccc::FF0x15y9 ::FF0x15y9(){ note_ctor("_ZN3ccc8FF0x15y9E", this);} // tgen
}
static void Test__ZN3ccc8FF0x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF0x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF0x15y9E, buf);
    ::ccc::FF0x15y9 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF0x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF0x15y9E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y9E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc8FF0x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF0x15y9E);
    dp->::ccc::FF0x15y9::~FF0x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF0x15y9E(Test__ZN3ccc8FF0x15y9E, "_ZN3ccc8FF0x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF0x15y9C1Ev();
extern void _ZN3ccc8FF0x15y9D1Ev();
Name_Map name_map__ZN3ccc8FF0x15y9E[] = {
  NSPAIR(_ZN3ccc8FF0x15y9C1Ev),
  NSPAIR(_ZN3ccc8FF0x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc8FF0x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8FF0x15y93efgEv();
extern void _ZN3ccc8FF0x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF0x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF0x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF0x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF0x15y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF0x15y9E[] = {
  {&(_ZTVN3ccc8FF0x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF0x15y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_8FF0x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF0x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF0x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF0x15y9E[];
Class_Descriptor cd__ZN3ccc8FF0x15y9E = {  "_ZN3ccc8FF0x15y9E", // class name
  bases__ZN3ccc8FF0x15y9E, 2,
  &(vtc__ZN3ccc8FF0x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF0x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF0x15y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF0x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF0x15y9E),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
namespace ccc { 
struct  FF0x15y10  : virtual ::ccc::EE0x15 {
  virtual void  pqr(); // _ZN3ccc9FF0x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF0x15y103abcEv
  ~FF0x15y10(); // tgen
  FF0x15y10(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y10E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x15y103pqrEv");}
void  ccc::FF0x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x15y103abcEv");}
ccc::FF0x15y10 ::~FF0x15y10(){ note_dtor("_ZN3ccc9FF0x15y10E", this);} // tgen
ccc::FF0x15y10 ::FF0x15y10(){ note_ctor("_ZN3ccc9FF0x15y10E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y10E, buf);
    ::ccc::FF0x15y10 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y10E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y10E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y10E);
    dp->::ccc::FF0x15y10::~FF0x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y10E(Test__ZN3ccc9FF0x15y10E, "_ZN3ccc9FF0x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y10C1Ev();
extern void _ZN3ccc9FF0x15y10D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y10E[] = {
  NSPAIR(_ZN3ccc9FF0x15y10C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y10E[];
extern void _ZN3ccc9FF0x15y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y10E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y10E[] = {
  {&(_ZTVN3ccc9FF0x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y10E[];
Class_Descriptor cd__ZN3ccc9FF0x15y10E = {  "_ZN3ccc9FF0x15y10E", // class name
  bases__ZN3ccc9FF0x15y10E, 2,
  &(vtc__ZN3ccc9FF0x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y10E),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
namespace ccc { 
struct  FF0x15y11  : virtual ::ccc::EE0x15 {
  virtual void  pqr(); // _ZN3ccc9FF0x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF0x15y113efgEv
  ~FF0x15y11(); // tgen
  FF0x15y11(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y11E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF0x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x15y113pqrEv");}
void  ccc::FF0x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x15y113efgEv");}
ccc::FF0x15y11 ::~FF0x15y11(){ note_dtor("_ZN3ccc9FF0x15y11E", this);} // tgen
ccc::FF0x15y11 ::FF0x15y11(){ note_ctor("_ZN3ccc9FF0x15y11E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y11E, buf);
    ::ccc::FF0x15y11 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y11E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y11E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y11E);
    dp->::ccc::FF0x15y11::~FF0x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y11E(Test__ZN3ccc9FF0x15y11E, "_ZN3ccc9FF0x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y11C1Ev();
extern void _ZN3ccc9FF0x15y11D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y11E[] = {
  NSPAIR(_ZN3ccc9FF0x15y11C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x15y113efgEv();
extern void _ZN3ccc9FF0x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y11E[] = {
  {&(_ZTVN3ccc9FF0x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y11E[];
Class_Descriptor cd__ZN3ccc9FF0x15y11E = {  "_ZN3ccc9FF0x15y11E", // class name
  bases__ZN3ccc9FF0x15y11E, 2,
  &(vtc__ZN3ccc9FF0x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y11E),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
namespace ccc { 
struct  FF0x15y12  : virtual ::ccc::EE0x15 {
  virtual void  abc(); // _ZN3ccc9FF0x15y123abcEv
  ~FF0x15y12(); // tgen
  FF0x15y12(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y12E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1}
}
namespace ccc { 
void  ccc::FF0x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF0x15y123abcEv");}
ccc::FF0x15y12 ::~FF0x15y12(){ note_dtor("_ZN3ccc9FF0x15y12E", this);} // tgen
ccc::FF0x15y12 ::FF0x15y12(){ note_ctor("_ZN3ccc9FF0x15y12E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y12E, buf);
    ::ccc::FF0x15y12 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y12E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y12E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y12E);
    dp->::ccc::FF0x15y12::~FF0x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y12E(Test__ZN3ccc9FF0x15y12E, "_ZN3ccc9FF0x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y12C1Ev();
extern void _ZN3ccc9FF0x15y12D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y12E[] = {
  NSPAIR(_ZN3ccc9FF0x15y12C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y12E[];
extern void _ZN3ccc9FF0x15y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y12E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y12E[] = {
  {&(_ZTVN3ccc9FF0x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y12E[];
Class_Descriptor cd__ZN3ccc9FF0x15y12E = {  "_ZN3ccc9FF0x15y12E", // class name
  bases__ZN3ccc9FF0x15y12E, 2,
  &(vtc__ZN3ccc9FF0x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y12E),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
namespace ccc { 
struct  FF0x15y13  : virtual ::ccc::EE0x15 {
  virtual void  efg(); // _ZN3ccc9FF0x15y133efgEv
  ~FF0x15y13(); // tgen
  FF0x15y13(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y13E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1}
}
namespace ccc { 
void  ccc::FF0x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF0x15y133efgEv");}
ccc::FF0x15y13 ::~FF0x15y13(){ note_dtor("_ZN3ccc9FF0x15y13E", this);} // tgen
ccc::FF0x15y13 ::FF0x15y13(){ note_ctor("_ZN3ccc9FF0x15y13E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y13E, buf);
    ::ccc::FF0x15y13 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y13E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y13E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y13E);
    dp->::ccc::FF0x15y13::~FF0x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y13E(Test__ZN3ccc9FF0x15y13E, "_ZN3ccc9FF0x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y13C1Ev();
extern void _ZN3ccc9FF0x15y13D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y13E[] = {
  NSPAIR(_ZN3ccc9FF0x15y13C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9FF0x15y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y13E[] = {
  {&(_ZTVN3ccc9FF0x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y13E[];
Class_Descriptor cd__ZN3ccc9FF0x15y13E = {  "_ZN3ccc9FF0x15y13E", // class name
  bases__ZN3ccc9FF0x15y13E, 2,
  &(vtc__ZN3ccc9FF0x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y13E),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
namespace ccc { 
struct  FF0x15y14  : virtual ::ccc::EE0x15 {
  virtual void  pqr(); // _ZN3ccc9FF0x15y143pqrEv
  ~FF0x15y14(); // tgen
  FF0x15y14(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y14E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1}
}
namespace ccc { 
void  ccc::FF0x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF0x15y143pqrEv");}
ccc::FF0x15y14 ::~FF0x15y14(){ note_dtor("_ZN3ccc9FF0x15y14E", this);} // tgen
ccc::FF0x15y14 ::FF0x15y14(){ note_ctor("_ZN3ccc9FF0x15y14E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y14E, buf);
    ::ccc::FF0x15y14 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y14E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y14E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y14E);
    dp->::ccc::FF0x15y14::~FF0x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y14E(Test__ZN3ccc9FF0x15y14E, "_ZN3ccc9FF0x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y14C1Ev();
extern void _ZN3ccc9FF0x15y14D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y14E[] = {
  NSPAIR(_ZN3ccc9FF0x15y14C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9FF0x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF0x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y14E[] = {
  {&(_ZTVN3ccc9FF0x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y14E[];
Class_Descriptor cd__ZN3ccc9FF0x15y14E = {  "_ZN3ccc9FF0x15y14E", // class name
  bases__ZN3ccc9FF0x15y14E, 2,
  &(vtc__ZN3ccc9FF0x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y14E),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
namespace ccc { 
struct  FF0x15y15  : virtual ::ccc::EE0x15 {
  ~FF0x15y15(); // tgen
  FF0x15y15(); // tgen
};
//SIG(1 _ZN3ccc9FF0x15y15E) C1{ VBC2{ VBC3{ v1 v2 v3}}}
}
namespace ccc { 
ccc::FF0x15y15 ::~FF0x15y15(){ note_dtor("_ZN3ccc9FF0x15y15E", this);} // tgen
ccc::FF0x15y15 ::FF0x15y15(){ note_ctor("_ZN3ccc9FF0x15y15E", this);} // tgen
}
static void Test__ZN3ccc9FF0x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF0x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF0x15y15E, buf);
    ::ccc::FF0x15y15 *dp, &lv = *(dp=new (buf) ::ccc::FF0x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF0x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF0x15y15E)");
    check_base_class_offset(lv, (::ccc::AA0*)(::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y15E");
    check_base_class_offset(lv, (::ccc::EE0x15*), 0, "_ZN3ccc9FF0x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF0x15y15E);
    dp->::ccc::FF0x15y15::~FF0x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF0x15y15E(Test__ZN3ccc9FF0x15y15E, "_ZN3ccc9FF0x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF0x15y15C1Ev();
extern void _ZN3ccc9FF0x15y15D1Ev();
Name_Map name_map__ZN3ccc9FF0x15y15E[] = {
  NSPAIR(_ZN3ccc9FF0x15y15C1Ev),
  NSPAIR(_ZN3ccc9FF0x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc6EE0x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE0x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE0x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE0x15E[];
static Base_Class bases__ZN3ccc9FF0x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE0x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF0x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF0x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF0x15y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE0x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF0x15y15E[] = {
  {&(_ZTVN3ccc9FF0x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF0x15y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE0x15E__NS_9FF0x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF0x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF0x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF0x15y15E[];
Class_Descriptor cd__ZN3ccc9FF0x15y15E = {  "_ZN3ccc9FF0x15y15E", // class name
  bases__ZN3ccc9FF0x15y15E, 2,
  &(vtc__ZN3ccc9FF0x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF0x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF0x15y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF0x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF0x15y15E),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
namespace ccc { 
struct  FF1x0y0  : virtual ::ccc::EE1x0 {
  virtual void  abc(); // _ZN3ccc7FF1x0y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y03pqrEv
  ~FF1x0y0(); // tgen
  FF1x0y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y03abcEv");}
void  ccc::FF1x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y03efgEv");}
void  ccc::FF1x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y03pqrEv");}
ccc::FF1x0y0 ::~FF1x0y0(){ note_dtor("_ZN3ccc7FF1x0y0E", this);} // tgen
ccc::FF1x0y0 ::FF1x0y0(){ note_ctor("_ZN3ccc7FF1x0y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y0E, buf);
    ::ccc::FF1x0y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y0E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y0E);
    dp->::ccc::FF1x0y0::~FF1x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y0E(Test__ZN3ccc7FF1x0y0E, "_ZN3ccc7FF1x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y0C1Ev();
extern void _ZN3ccc7FF1x0y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y0E[] = {
  NSPAIR(_ZN3ccc7FF1x0y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y0E[];
extern void _ZN3ccc7FF1x0y03abcEv();
extern void _ZN3ccc7FF1x0y03pqrEv();
extern void _ZN3ccc7FF1x0y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y0E[] = {
  {&(_ZTVN3ccc7FF1x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y0E[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y0E = {  "_ZN3ccc7FF1x0y0E", // class name
  bases__ZN3ccc7FF1x0y0E, 2,
  &(vtc__ZN3ccc7FF1x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y1  : virtual ::ccc::EE1x0 {
  virtual void  abc(); // _ZN3ccc7FF1x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x0y13efgEv
  ~FF1x0y1(); // tgen
  FF1x0y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y13abcEv");}
void  ccc::FF1x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y13pqrEv");}
void  ccc::FF1x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y13efgEv");}
ccc::FF1x0y1 ::~FF1x0y1(){ note_dtor("_ZN3ccc7FF1x0y1E", this);} // tgen
ccc::FF1x0y1 ::FF1x0y1(){ note_ctor("_ZN3ccc7FF1x0y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y1E, buf);
    ::ccc::FF1x0y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y1E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y1E);
    dp->::ccc::FF1x0y1::~FF1x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y1E(Test__ZN3ccc7FF1x0y1E, "_ZN3ccc7FF1x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y1C1Ev();
extern void _ZN3ccc7FF1x0y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y1E[] = {
  NSPAIR(_ZN3ccc7FF1x0y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y1E[];
extern void _ZN3ccc7FF1x0y13abcEv();
extern void _ZN3ccc7FF1x0y13pqrEv();
extern void _ZN3ccc7FF1x0y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y1E[] = {
  {&(_ZTVN3ccc7FF1x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y1E[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y1E = {  "_ZN3ccc7FF1x0y1E", // class name
  bases__ZN3ccc7FF1x0y1E, 2,
  &(vtc__ZN3ccc7FF1x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y2  : virtual ::ccc::EE1x0 {
  virtual void  efg(); // _ZN3ccc7FF1x0y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y23pqrEv
  ~FF1x0y2(); // tgen
  FF1x0y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y23efgEv");}
void  ccc::FF1x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y23abcEv");}
void  ccc::FF1x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y23pqrEv");}
ccc::FF1x0y2 ::~FF1x0y2(){ note_dtor("_ZN3ccc7FF1x0y2E", this);} // tgen
ccc::FF1x0y2 ::FF1x0y2(){ note_ctor("_ZN3ccc7FF1x0y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y2E, buf);
    ::ccc::FF1x0y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y2E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y2E);
    dp->::ccc::FF1x0y2::~FF1x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y2E(Test__ZN3ccc7FF1x0y2E, "_ZN3ccc7FF1x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y2C1Ev();
extern void _ZN3ccc7FF1x0y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y2E[] = {
  NSPAIR(_ZN3ccc7FF1x0y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y2E[];
extern void _ZN3ccc7FF1x0y23abcEv();
extern void _ZN3ccc7FF1x0y23pqrEv();
extern void _ZN3ccc7FF1x0y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y2E[] = {
  {&(_ZTVN3ccc7FF1x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y2E[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y2E = {  "_ZN3ccc7FF1x0y2E", // class name
  bases__ZN3ccc7FF1x0y2E, 2,
  &(vtc__ZN3ccc7FF1x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y3  : virtual ::ccc::EE1x0 {
  virtual void  efg(); // _ZN3ccc7FF1x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x0y33abcEv
  ~FF1x0y3(); // tgen
  FF1x0y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y33efgEv");}
void  ccc::FF1x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y33pqrEv");}
void  ccc::FF1x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y33abcEv");}
ccc::FF1x0y3 ::~FF1x0y3(){ note_dtor("_ZN3ccc7FF1x0y3E", this);} // tgen
ccc::FF1x0y3 ::FF1x0y3(){ note_ctor("_ZN3ccc7FF1x0y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y3E, buf);
    ::ccc::FF1x0y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y3E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y3E);
    dp->::ccc::FF1x0y3::~FF1x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y3E(Test__ZN3ccc7FF1x0y3E, "_ZN3ccc7FF1x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y3C1Ev();
extern void _ZN3ccc7FF1x0y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y3E[] = {
  NSPAIR(_ZN3ccc7FF1x0y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y3E[];
extern void _ZN3ccc7FF1x0y33abcEv();
extern void _ZN3ccc7FF1x0y33pqrEv();
extern void _ZN3ccc7FF1x0y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y3E[] = {
  {&(_ZTVN3ccc7FF1x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y3E[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y3E = {  "_ZN3ccc7FF1x0y3E", // class name
  bases__ZN3ccc7FF1x0y3E, 2,
  &(vtc__ZN3ccc7FF1x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y4  : virtual ::ccc::EE1x0 {
  virtual void  pqr(); // _ZN3ccc7FF1x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x0y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x0y43efgEv
  ~FF1x0y4(); // tgen
  FF1x0y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y43pqrEv");}
void  ccc::FF1x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y43abcEv");}
void  ccc::FF1x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y43efgEv");}
ccc::FF1x0y4 ::~FF1x0y4(){ note_dtor("_ZN3ccc7FF1x0y4E", this);} // tgen
ccc::FF1x0y4 ::FF1x0y4(){ note_ctor("_ZN3ccc7FF1x0y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y4E, buf);
    ::ccc::FF1x0y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y4E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y4E);
    dp->::ccc::FF1x0y4::~FF1x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y4E(Test__ZN3ccc7FF1x0y4E, "_ZN3ccc7FF1x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y4C1Ev();
extern void _ZN3ccc7FF1x0y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y4E[] = {
  NSPAIR(_ZN3ccc7FF1x0y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y4E[];
extern void _ZN3ccc7FF1x0y43abcEv();
extern void _ZN3ccc7FF1x0y43pqrEv();
extern void _ZN3ccc7FF1x0y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y4E[] = {
  {&(_ZTVN3ccc7FF1x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y4E[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y4E = {  "_ZN3ccc7FF1x0y4E", // class name
  bases__ZN3ccc7FF1x0y4E, 2,
  &(vtc__ZN3ccc7FF1x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y5  : virtual ::ccc::EE1x0 {
  virtual void  pqr(); // _ZN3ccc7FF1x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x0y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x0y53abcEv
  ~FF1x0y5(); // tgen
  FF1x0y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y53pqrEv");}
void  ccc::FF1x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y53efgEv");}
void  ccc::FF1x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y53abcEv");}
ccc::FF1x0y5 ::~FF1x0y5(){ note_dtor("_ZN3ccc7FF1x0y5E", this);} // tgen
ccc::FF1x0y5 ::FF1x0y5(){ note_ctor("_ZN3ccc7FF1x0y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y5E, buf);
    ::ccc::FF1x0y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y5E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y5E);
    dp->::ccc::FF1x0y5::~FF1x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y5E(Test__ZN3ccc7FF1x0y5E, "_ZN3ccc7FF1x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y5C1Ev();
extern void _ZN3ccc7FF1x0y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y5E[] = {
  NSPAIR(_ZN3ccc7FF1x0y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y5E[];
extern void _ZN3ccc7FF1x0y53abcEv();
extern void _ZN3ccc7FF1x0y53pqrEv();
extern void _ZN3ccc7FF1x0y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y5E[] = {
  {&(_ZTVN3ccc7FF1x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y5E[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y5E = {  "_ZN3ccc7FF1x0y5E", // class name
  bases__ZN3ccc7FF1x0y5E, 2,
  &(vtc__ZN3ccc7FF1x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y6  : virtual ::ccc::EE1x0 {
  virtual void  abc(); // _ZN3ccc7FF1x0y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x0y63efgEv
  ~FF1x0y6(); // tgen
  FF1x0y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y63abcEv");}
void  ccc::FF1x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y63efgEv");}
ccc::FF1x0y6 ::~FF1x0y6(){ note_dtor("_ZN3ccc7FF1x0y6E", this);} // tgen
ccc::FF1x0y6 ::FF1x0y6(){ note_ctor("_ZN3ccc7FF1x0y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y6E, buf);
    ::ccc::FF1x0y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y6E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y6E);
    dp->::ccc::FF1x0y6::~FF1x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y6E(Test__ZN3ccc7FF1x0y6E, "_ZN3ccc7FF1x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y6C1Ev();
extern void _ZN3ccc7FF1x0y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y6E[] = {
  NSPAIR(_ZN3ccc7FF1x0y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y6E[];
extern void _ZN3ccc7FF1x0y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x0y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y6E[] = {
  {&(_ZTVN3ccc7FF1x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y6E[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y6E = {  "_ZN3ccc7FF1x0y6E", // class name
  bases__ZN3ccc7FF1x0y6E, 2,
  &(vtc__ZN3ccc7FF1x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y7  : virtual ::ccc::EE1x0 {
  virtual void  abc(); // _ZN3ccc7FF1x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y73pqrEv
  ~FF1x0y7(); // tgen
  FF1x0y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y73abcEv");}
void  ccc::FF1x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y73pqrEv");}
ccc::FF1x0y7 ::~FF1x0y7(){ note_dtor("_ZN3ccc7FF1x0y7E", this);} // tgen
ccc::FF1x0y7 ::FF1x0y7(){ note_ctor("_ZN3ccc7FF1x0y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y7E, buf);
    ::ccc::FF1x0y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y7E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y7E);
    dp->::ccc::FF1x0y7::~FF1x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y7E(Test__ZN3ccc7FF1x0y7E, "_ZN3ccc7FF1x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y7C1Ev();
extern void _ZN3ccc7FF1x0y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y7E[] = {
  NSPAIR(_ZN3ccc7FF1x0y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y7E[];
extern void _ZN3ccc7FF1x0y73abcEv();
extern void _ZN3ccc7FF1x0y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y7E[] = {
  {&(_ZTVN3ccc7FF1x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y7E[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y7E = {  "_ZN3ccc7FF1x0y7E", // class name
  bases__ZN3ccc7FF1x0y7E, 2,
  &(vtc__ZN3ccc7FF1x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y8  : virtual ::ccc::EE1x0 {
  virtual void  efg(); // _ZN3ccc7FF1x0y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x0y83abcEv
  ~FF1x0y8(); // tgen
  FF1x0y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y83efgEv");}
void  ccc::FF1x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x0y83abcEv");}
ccc::FF1x0y8 ::~FF1x0y8(){ note_dtor("_ZN3ccc7FF1x0y8E", this);} // tgen
ccc::FF1x0y8 ::FF1x0y8(){ note_ctor("_ZN3ccc7FF1x0y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y8E, buf);
    ::ccc::FF1x0y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y8E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y8E);
    dp->::ccc::FF1x0y8::~FF1x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y8E(Test__ZN3ccc7FF1x0y8E, "_ZN3ccc7FF1x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y8C1Ev();
extern void _ZN3ccc7FF1x0y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y8E[] = {
  NSPAIR(_ZN3ccc7FF1x0y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y8E[];
extern void _ZN3ccc7FF1x0y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x0y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y8E[] = {
  {&(_ZTVN3ccc7FF1x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y8E[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y8E = {  "_ZN3ccc7FF1x0y8E", // class name
  bases__ZN3ccc7FF1x0y8E, 2,
  &(vtc__ZN3ccc7FF1x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y9  : virtual ::ccc::EE1x0 {
  virtual void  efg(); // _ZN3ccc7FF1x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x0y93pqrEv
  ~FF1x0y9(); // tgen
  FF1x0y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x0y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x0y93efgEv");}
void  ccc::FF1x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x0y93pqrEv");}
ccc::FF1x0y9 ::~FF1x0y9(){ note_dtor("_ZN3ccc7FF1x0y9E", this);} // tgen
ccc::FF1x0y9 ::FF1x0y9(){ note_ctor("_ZN3ccc7FF1x0y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x0y9E, buf);
    ::ccc::FF1x0y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x0y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y9E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc7FF1x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x0y9E);
    dp->::ccc::FF1x0y9::~FF1x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x0y9E(Test__ZN3ccc7FF1x0y9E, "_ZN3ccc7FF1x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x0y9C1Ev();
extern void _ZN3ccc7FF1x0y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x0y9E[] = {
  NSPAIR(_ZN3ccc7FF1x0y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc7FF1x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x0y93pqrEv();
extern void _ZN3ccc7FF1x0y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x0y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x0y9E[] = {
  {&(_ZTVN3ccc7FF1x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x0y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_7FF1x0y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x0y9E[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x0y9E = {  "_ZN3ccc7FF1x0y9E", // class name
  bases__ZN3ccc7FF1x0y9E, 2,
  &(vtc__ZN3ccc7FF1x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x0y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x0y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x0y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x0y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y10  : virtual ::ccc::EE1x0 {
  virtual void  pqr(); // _ZN3ccc8FF1x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x0y103abcEv
  ~FF1x0y10(); // tgen
  FF1x0y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x0y103pqrEv");}
void  ccc::FF1x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x0y103abcEv");}
ccc::FF1x0y10 ::~FF1x0y10(){ note_dtor("_ZN3ccc8FF1x0y10E", this);} // tgen
ccc::FF1x0y10 ::FF1x0y10(){ note_ctor("_ZN3ccc8FF1x0y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y10E, buf);
    ::ccc::FF1x0y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y10E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y10E);
    dp->::ccc::FF1x0y10::~FF1x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y10E(Test__ZN3ccc8FF1x0y10E, "_ZN3ccc8FF1x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y10C1Ev();
extern void _ZN3ccc8FF1x0y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y10E[] = {
  NSPAIR(_ZN3ccc8FF1x0y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y10E[];
extern void _ZN3ccc8FF1x0y103abcEv();
extern void _ZN3ccc8FF1x0y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y10E[] = {
  {&(_ZTVN3ccc8FF1x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y10E[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y10E = {  "_ZN3ccc8FF1x0y10E", // class name
  bases__ZN3ccc8FF1x0y10E, 2,
  &(vtc__ZN3ccc8FF1x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y11  : virtual ::ccc::EE1x0 {
  virtual void  pqr(); // _ZN3ccc8FF1x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x0y113efgEv
  ~FF1x0y11(); // tgen
  FF1x0y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x0y113pqrEv");}
void  ccc::FF1x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x0y113efgEv");}
ccc::FF1x0y11 ::~FF1x0y11(){ note_dtor("_ZN3ccc8FF1x0y11E", this);} // tgen
ccc::FF1x0y11 ::FF1x0y11(){ note_ctor("_ZN3ccc8FF1x0y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y11E, buf);
    ::ccc::FF1x0y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y11E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y11E);
    dp->::ccc::FF1x0y11::~FF1x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y11E(Test__ZN3ccc8FF1x0y11E, "_ZN3ccc8FF1x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y11C1Ev();
extern void _ZN3ccc8FF1x0y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y11E[] = {
  NSPAIR(_ZN3ccc8FF1x0y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x0y113pqrEv();
extern void _ZN3ccc8FF1x0y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y11E[] = {
  {&(_ZTVN3ccc8FF1x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y11E[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y11E = {  "_ZN3ccc8FF1x0y11E", // class name
  bases__ZN3ccc8FF1x0y11E, 2,
  &(vtc__ZN3ccc8FF1x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y12  : virtual ::ccc::EE1x0 {
  virtual void  abc(); // _ZN3ccc8FF1x0y123abcEv
  ~FF1x0y12(); // tgen
  FF1x0y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x0y123abcEv");}
ccc::FF1x0y12 ::~FF1x0y12(){ note_dtor("_ZN3ccc8FF1x0y12E", this);} // tgen
ccc::FF1x0y12 ::FF1x0y12(){ note_ctor("_ZN3ccc8FF1x0y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y12E, buf);
    ::ccc::FF1x0y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y12E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y12E);
    dp->::ccc::FF1x0y12::~FF1x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y12E(Test__ZN3ccc8FF1x0y12E, "_ZN3ccc8FF1x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y12C1Ev();
extern void _ZN3ccc8FF1x0y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y12E[] = {
  NSPAIR(_ZN3ccc8FF1x0y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y12E[];
extern void _ZN3ccc8FF1x0y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y12E[] = {
  {&(_ZTVN3ccc8FF1x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y12E[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y12E = {  "_ZN3ccc8FF1x0y12E", // class name
  bases__ZN3ccc8FF1x0y12E, 2,
  &(vtc__ZN3ccc8FF1x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y13  : virtual ::ccc::EE1x0 {
  virtual void  efg(); // _ZN3ccc8FF1x0y133efgEv
  ~FF1x0y13(); // tgen
  FF1x0y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x0y133efgEv");}
ccc::FF1x0y13 ::~FF1x0y13(){ note_dtor("_ZN3ccc8FF1x0y13E", this);} // tgen
ccc::FF1x0y13 ::FF1x0y13(){ note_ctor("_ZN3ccc8FF1x0y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y13E, buf);
    ::ccc::FF1x0y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y13E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y13E);
    dp->::ccc::FF1x0y13::~FF1x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y13E(Test__ZN3ccc8FF1x0y13E, "_ZN3ccc8FF1x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y13C1Ev();
extern void _ZN3ccc8FF1x0y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y13E[] = {
  NSPAIR(_ZN3ccc8FF1x0y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x0y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y13E[] = {
  {&(_ZTVN3ccc8FF1x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y13E[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y13E = {  "_ZN3ccc8FF1x0y13E", // class name
  bases__ZN3ccc8FF1x0y13E, 2,
  &(vtc__ZN3ccc8FF1x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y14  : virtual ::ccc::EE1x0 {
  virtual void  pqr(); // _ZN3ccc8FF1x0y143pqrEv
  ~FF1x0y14(); // tgen
  FF1x0y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x0y143pqrEv");}
ccc::FF1x0y14 ::~FF1x0y14(){ note_dtor("_ZN3ccc8FF1x0y14E", this);} // tgen
ccc::FF1x0y14 ::FF1x0y14(){ note_ctor("_ZN3ccc8FF1x0y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y14E, buf);
    ::ccc::FF1x0y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y14E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y14E);
    dp->::ccc::FF1x0y14::~FF1x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y14E(Test__ZN3ccc8FF1x0y14E, "_ZN3ccc8FF1x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y14C1Ev();
extern void _ZN3ccc8FF1x0y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y14E[] = {
  NSPAIR(_ZN3ccc8FF1x0y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x0y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x0y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y14E[] = {
  {&(_ZTVN3ccc8FF1x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y14E[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y14E = {  "_ZN3ccc8FF1x0y14E", // class name
  bases__ZN3ccc8FF1x0y14E, 2,
  &(vtc__ZN3ccc8FF1x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x0y15  : virtual ::ccc::EE1x0 {
  ~FF1x0y15(); // tgen
  FF1x0y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x0y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x0y15 ::~FF1x0y15(){ note_dtor("_ZN3ccc8FF1x0y15E", this);} // tgen
ccc::FF1x0y15 ::FF1x0y15(){ note_ctor("_ZN3ccc8FF1x0y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x0y15E, buf);
    ::ccc::FF1x0y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x0y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y15E");
    check_base_class_offset(lv, (::ccc::EE1x0*), 0, "_ZN3ccc8FF1x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x0y15E);
    dp->::ccc::FF1x0y15::~FF1x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x0y15E(Test__ZN3ccc8FF1x0y15E, "_ZN3ccc8FF1x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x0y15C1Ev();
extern void _ZN3ccc8FF1x0y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x0y15E[] = {
  NSPAIR(_ZN3ccc8FF1x0y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x0E[];
static Base_Class bases__ZN3ccc8FF1x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x0y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv)();
extern void _ZN3ccc5EE1x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv)();
extern void _ZN3ccc5EE1x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv)();
extern void _ZN3ccc5EE1x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x0y15E[] = {
  {&(_ZTVN3ccc8FF1x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x0y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x0E__NS_8FF1x0y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x0y15E[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x03efgEv,_ZTv0_n20_N3ccc5EE1x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x03pqrEv,_ZTv0_n16_N3ccc5EE1x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x03abcEv,_ZTv0_n12_N3ccc5EE1x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x0y15E = {  "_ZN3ccc8FF1x0y15E", // class name
  bases__ZN3ccc8FF1x0y15E, 2,
  &(vtc__ZN3ccc8FF1x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x0y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x0y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x0y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x0y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names256,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y0  : virtual ::ccc::EE1x1 {
  virtual void  abc(); // _ZN3ccc7FF1x1y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y03pqrEv
  ~FF1x1y0(); // tgen
  FF1x1y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y03abcEv");}
void  ccc::FF1x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y03efgEv");}
void  ccc::FF1x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y03pqrEv");}
ccc::FF1x1y0 ::~FF1x1y0(){ note_dtor("_ZN3ccc7FF1x1y0E", this);} // tgen
ccc::FF1x1y0 ::FF1x1y0(){ note_ctor("_ZN3ccc7FF1x1y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y0E, buf);
    ::ccc::FF1x1y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y0E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y0E);
    dp->::ccc::FF1x1y0::~FF1x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y0E(Test__ZN3ccc7FF1x1y0E, "_ZN3ccc7FF1x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y0C1Ev();
extern void _ZN3ccc7FF1x1y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y0E[] = {
  NSPAIR(_ZN3ccc7FF1x1y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y0E[];
extern void _ZN3ccc7FF1x1y03abcEv();
extern void _ZN3ccc7FF1x1y03pqrEv();
extern void _ZN3ccc7FF1x1y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y0E[] = {
  {&(_ZTVN3ccc7FF1x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y0E[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y0E = {  "_ZN3ccc7FF1x1y0E", // class name
  bases__ZN3ccc7FF1x1y0E, 2,
  &(vtc__ZN3ccc7FF1x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names257,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y1  : virtual ::ccc::EE1x1 {
  virtual void  abc(); // _ZN3ccc7FF1x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x1y13efgEv
  ~FF1x1y1(); // tgen
  FF1x1y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y13abcEv");}
void  ccc::FF1x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y13pqrEv");}
void  ccc::FF1x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y13efgEv");}
ccc::FF1x1y1 ::~FF1x1y1(){ note_dtor("_ZN3ccc7FF1x1y1E", this);} // tgen
ccc::FF1x1y1 ::FF1x1y1(){ note_ctor("_ZN3ccc7FF1x1y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y1E, buf);
    ::ccc::FF1x1y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y1E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y1E);
    dp->::ccc::FF1x1y1::~FF1x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y1E(Test__ZN3ccc7FF1x1y1E, "_ZN3ccc7FF1x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y1C1Ev();
extern void _ZN3ccc7FF1x1y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y1E[] = {
  NSPAIR(_ZN3ccc7FF1x1y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y1E[];
extern void _ZN3ccc7FF1x1y13abcEv();
extern void _ZN3ccc7FF1x1y13pqrEv();
extern void _ZN3ccc7FF1x1y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y1E[] = {
  {&(_ZTVN3ccc7FF1x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y1E[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y1E = {  "_ZN3ccc7FF1x1y1E", // class name
  bases__ZN3ccc7FF1x1y1E, 2,
  &(vtc__ZN3ccc7FF1x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names258,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y2  : virtual ::ccc::EE1x1 {
  virtual void  efg(); // _ZN3ccc7FF1x1y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y23pqrEv
  ~FF1x1y2(); // tgen
  FF1x1y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y23efgEv");}
void  ccc::FF1x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y23abcEv");}
void  ccc::FF1x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y23pqrEv");}
ccc::FF1x1y2 ::~FF1x1y2(){ note_dtor("_ZN3ccc7FF1x1y2E", this);} // tgen
ccc::FF1x1y2 ::FF1x1y2(){ note_ctor("_ZN3ccc7FF1x1y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y2E, buf);
    ::ccc::FF1x1y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y2E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y2E);
    dp->::ccc::FF1x1y2::~FF1x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y2E(Test__ZN3ccc7FF1x1y2E, "_ZN3ccc7FF1x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y2C1Ev();
extern void _ZN3ccc7FF1x1y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y2E[] = {
  NSPAIR(_ZN3ccc7FF1x1y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y2E[];
extern void _ZN3ccc7FF1x1y23abcEv();
extern void _ZN3ccc7FF1x1y23pqrEv();
extern void _ZN3ccc7FF1x1y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y2E[] = {
  {&(_ZTVN3ccc7FF1x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y2E[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y2E = {  "_ZN3ccc7FF1x1y2E", // class name
  bases__ZN3ccc7FF1x1y2E, 2,
  &(vtc__ZN3ccc7FF1x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names259,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y3  : virtual ::ccc::EE1x1 {
  virtual void  efg(); // _ZN3ccc7FF1x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x1y33abcEv
  ~FF1x1y3(); // tgen
  FF1x1y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y33efgEv");}
void  ccc::FF1x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y33pqrEv");}
void  ccc::FF1x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y33abcEv");}
ccc::FF1x1y3 ::~FF1x1y3(){ note_dtor("_ZN3ccc7FF1x1y3E", this);} // tgen
ccc::FF1x1y3 ::FF1x1y3(){ note_ctor("_ZN3ccc7FF1x1y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y3E, buf);
    ::ccc::FF1x1y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y3E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y3E);
    dp->::ccc::FF1x1y3::~FF1x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y3E(Test__ZN3ccc7FF1x1y3E, "_ZN3ccc7FF1x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y3C1Ev();
extern void _ZN3ccc7FF1x1y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y3E[] = {
  NSPAIR(_ZN3ccc7FF1x1y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y3E[];
extern void _ZN3ccc7FF1x1y33abcEv();
extern void _ZN3ccc7FF1x1y33pqrEv();
extern void _ZN3ccc7FF1x1y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y3E[] = {
  {&(_ZTVN3ccc7FF1x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y3E[];
static VTBL_ENTRY alt_thunk_names260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y3E = {  "_ZN3ccc7FF1x1y3E", // class name
  bases__ZN3ccc7FF1x1y3E, 2,
  &(vtc__ZN3ccc7FF1x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names260,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y4  : virtual ::ccc::EE1x1 {
  virtual void  pqr(); // _ZN3ccc7FF1x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x1y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x1y43efgEv
  ~FF1x1y4(); // tgen
  FF1x1y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y43pqrEv");}
void  ccc::FF1x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y43abcEv");}
void  ccc::FF1x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y43efgEv");}
ccc::FF1x1y4 ::~FF1x1y4(){ note_dtor("_ZN3ccc7FF1x1y4E", this);} // tgen
ccc::FF1x1y4 ::FF1x1y4(){ note_ctor("_ZN3ccc7FF1x1y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y4E, buf);
    ::ccc::FF1x1y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y4E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y4E);
    dp->::ccc::FF1x1y4::~FF1x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y4E(Test__ZN3ccc7FF1x1y4E, "_ZN3ccc7FF1x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y4C1Ev();
extern void _ZN3ccc7FF1x1y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y4E[] = {
  NSPAIR(_ZN3ccc7FF1x1y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y4E[];
extern void _ZN3ccc7FF1x1y43abcEv();
extern void _ZN3ccc7FF1x1y43pqrEv();
extern void _ZN3ccc7FF1x1y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y4E[] = {
  {&(_ZTVN3ccc7FF1x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y4E[];
static VTBL_ENTRY alt_thunk_names261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y4E = {  "_ZN3ccc7FF1x1y4E", // class name
  bases__ZN3ccc7FF1x1y4E, 2,
  &(vtc__ZN3ccc7FF1x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names261,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y5  : virtual ::ccc::EE1x1 {
  virtual void  pqr(); // _ZN3ccc7FF1x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x1y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x1y53abcEv
  ~FF1x1y5(); // tgen
  FF1x1y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y53pqrEv");}
void  ccc::FF1x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y53efgEv");}
void  ccc::FF1x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y53abcEv");}
ccc::FF1x1y5 ::~FF1x1y5(){ note_dtor("_ZN3ccc7FF1x1y5E", this);} // tgen
ccc::FF1x1y5 ::FF1x1y5(){ note_ctor("_ZN3ccc7FF1x1y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y5E, buf);
    ::ccc::FF1x1y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y5E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y5E);
    dp->::ccc::FF1x1y5::~FF1x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y5E(Test__ZN3ccc7FF1x1y5E, "_ZN3ccc7FF1x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y5C1Ev();
extern void _ZN3ccc7FF1x1y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y5E[] = {
  NSPAIR(_ZN3ccc7FF1x1y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y5E[];
extern void _ZN3ccc7FF1x1y53abcEv();
extern void _ZN3ccc7FF1x1y53pqrEv();
extern void _ZN3ccc7FF1x1y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y5E[] = {
  {&(_ZTVN3ccc7FF1x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y5E[];
static VTBL_ENTRY alt_thunk_names262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y5E = {  "_ZN3ccc7FF1x1y5E", // class name
  bases__ZN3ccc7FF1x1y5E, 2,
  &(vtc__ZN3ccc7FF1x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names262,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y6  : virtual ::ccc::EE1x1 {
  virtual void  abc(); // _ZN3ccc7FF1x1y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x1y63efgEv
  ~FF1x1y6(); // tgen
  FF1x1y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y63abcEv");}
void  ccc::FF1x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y63efgEv");}
ccc::FF1x1y6 ::~FF1x1y6(){ note_dtor("_ZN3ccc7FF1x1y6E", this);} // tgen
ccc::FF1x1y6 ::FF1x1y6(){ note_ctor("_ZN3ccc7FF1x1y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y6E, buf);
    ::ccc::FF1x1y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y6E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y6E);
    dp->::ccc::FF1x1y6::~FF1x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y6E(Test__ZN3ccc7FF1x1y6E, "_ZN3ccc7FF1x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y6C1Ev();
extern void _ZN3ccc7FF1x1y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y6E[] = {
  NSPAIR(_ZN3ccc7FF1x1y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y6E[];
extern void _ZN3ccc7FF1x1y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x1y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y6E[] = {
  {&(_ZTVN3ccc7FF1x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y6E[];
static VTBL_ENTRY alt_thunk_names263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y6E = {  "_ZN3ccc7FF1x1y6E", // class name
  bases__ZN3ccc7FF1x1y6E, 2,
  &(vtc__ZN3ccc7FF1x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names263,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y7  : virtual ::ccc::EE1x1 {
  virtual void  abc(); // _ZN3ccc7FF1x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y73pqrEv
  ~FF1x1y7(); // tgen
  FF1x1y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y73abcEv");}
void  ccc::FF1x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y73pqrEv");}
ccc::FF1x1y7 ::~FF1x1y7(){ note_dtor("_ZN3ccc7FF1x1y7E", this);} // tgen
ccc::FF1x1y7 ::FF1x1y7(){ note_ctor("_ZN3ccc7FF1x1y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y7E, buf);
    ::ccc::FF1x1y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y7E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y7E);
    dp->::ccc::FF1x1y7::~FF1x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y7E(Test__ZN3ccc7FF1x1y7E, "_ZN3ccc7FF1x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y7C1Ev();
extern void _ZN3ccc7FF1x1y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y7E[] = {
  NSPAIR(_ZN3ccc7FF1x1y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y7E[];
extern void _ZN3ccc7FF1x1y73abcEv();
extern void _ZN3ccc7FF1x1y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y7E[] = {
  {&(_ZTVN3ccc7FF1x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y7E[];
static VTBL_ENTRY alt_thunk_names264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y7E = {  "_ZN3ccc7FF1x1y7E", // class name
  bases__ZN3ccc7FF1x1y7E, 2,
  &(vtc__ZN3ccc7FF1x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names264,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y8  : virtual ::ccc::EE1x1 {
  virtual void  efg(); // _ZN3ccc7FF1x1y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x1y83abcEv
  ~FF1x1y8(); // tgen
  FF1x1y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y83efgEv");}
void  ccc::FF1x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x1y83abcEv");}
ccc::FF1x1y8 ::~FF1x1y8(){ note_dtor("_ZN3ccc7FF1x1y8E", this);} // tgen
ccc::FF1x1y8 ::FF1x1y8(){ note_ctor("_ZN3ccc7FF1x1y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y8E, buf);
    ::ccc::FF1x1y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y8E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y8E);
    dp->::ccc::FF1x1y8::~FF1x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y8E(Test__ZN3ccc7FF1x1y8E, "_ZN3ccc7FF1x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y8C1Ev();
extern void _ZN3ccc7FF1x1y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y8E[] = {
  NSPAIR(_ZN3ccc7FF1x1y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y8E[];
extern void _ZN3ccc7FF1x1y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x1y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y8E[] = {
  {&(_ZTVN3ccc7FF1x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y8E[];
static VTBL_ENTRY alt_thunk_names265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y8E = {  "_ZN3ccc7FF1x1y8E", // class name
  bases__ZN3ccc7FF1x1y8E, 2,
  &(vtc__ZN3ccc7FF1x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names265,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y9  : virtual ::ccc::EE1x1 {
  virtual void  efg(); // _ZN3ccc7FF1x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x1y93pqrEv
  ~FF1x1y9(); // tgen
  FF1x1y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x1y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x1y93efgEv");}
void  ccc::FF1x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x1y93pqrEv");}
ccc::FF1x1y9 ::~FF1x1y9(){ note_dtor("_ZN3ccc7FF1x1y9E", this);} // tgen
ccc::FF1x1y9 ::FF1x1y9(){ note_ctor("_ZN3ccc7FF1x1y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x1y9E, buf);
    ::ccc::FF1x1y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x1y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y9E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc7FF1x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x1y9E);
    dp->::ccc::FF1x1y9::~FF1x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x1y9E(Test__ZN3ccc7FF1x1y9E, "_ZN3ccc7FF1x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x1y9C1Ev();
extern void _ZN3ccc7FF1x1y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x1y9E[] = {
  NSPAIR(_ZN3ccc7FF1x1y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc7FF1x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x1y93pqrEv();
extern void _ZN3ccc7FF1x1y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x1y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x1y9E[] = {
  {&(_ZTVN3ccc7FF1x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x1y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_7FF1x1y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x1y9E[];
static VTBL_ENTRY alt_thunk_names266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x1y9E = {  "_ZN3ccc7FF1x1y9E", // class name
  bases__ZN3ccc7FF1x1y9E, 2,
  &(vtc__ZN3ccc7FF1x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x1y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x1y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x1y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x1y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names266,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y10  : virtual ::ccc::EE1x1 {
  virtual void  pqr(); // _ZN3ccc8FF1x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x1y103abcEv
  ~FF1x1y10(); // tgen
  FF1x1y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x1y103pqrEv");}
void  ccc::FF1x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x1y103abcEv");}
ccc::FF1x1y10 ::~FF1x1y10(){ note_dtor("_ZN3ccc8FF1x1y10E", this);} // tgen
ccc::FF1x1y10 ::FF1x1y10(){ note_ctor("_ZN3ccc8FF1x1y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y10E, buf);
    ::ccc::FF1x1y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y10E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y10E);
    dp->::ccc::FF1x1y10::~FF1x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y10E(Test__ZN3ccc8FF1x1y10E, "_ZN3ccc8FF1x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y10C1Ev();
extern void _ZN3ccc8FF1x1y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y10E[] = {
  NSPAIR(_ZN3ccc8FF1x1y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y10E[];
extern void _ZN3ccc8FF1x1y103abcEv();
extern void _ZN3ccc8FF1x1y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y10E[] = {
  {&(_ZTVN3ccc8FF1x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y10E[];
static VTBL_ENTRY alt_thunk_names267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y10E = {  "_ZN3ccc8FF1x1y10E", // class name
  bases__ZN3ccc8FF1x1y10E, 2,
  &(vtc__ZN3ccc8FF1x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names267,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y11  : virtual ::ccc::EE1x1 {
  virtual void  pqr(); // _ZN3ccc8FF1x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x1y113efgEv
  ~FF1x1y11(); // tgen
  FF1x1y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x1y113pqrEv");}
void  ccc::FF1x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x1y113efgEv");}
ccc::FF1x1y11 ::~FF1x1y11(){ note_dtor("_ZN3ccc8FF1x1y11E", this);} // tgen
ccc::FF1x1y11 ::FF1x1y11(){ note_ctor("_ZN3ccc8FF1x1y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y11E, buf);
    ::ccc::FF1x1y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y11E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y11E);
    dp->::ccc::FF1x1y11::~FF1x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y11E(Test__ZN3ccc8FF1x1y11E, "_ZN3ccc8FF1x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y11C1Ev();
extern void _ZN3ccc8FF1x1y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y11E[] = {
  NSPAIR(_ZN3ccc8FF1x1y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x1y113pqrEv();
extern void _ZN3ccc8FF1x1y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y11E[] = {
  {&(_ZTVN3ccc8FF1x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y11E[];
static VTBL_ENTRY alt_thunk_names268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y11E = {  "_ZN3ccc8FF1x1y11E", // class name
  bases__ZN3ccc8FF1x1y11E, 2,
  &(vtc__ZN3ccc8FF1x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names268,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y12  : virtual ::ccc::EE1x1 {
  virtual void  abc(); // _ZN3ccc8FF1x1y123abcEv
  ~FF1x1y12(); // tgen
  FF1x1y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x1y123abcEv");}
ccc::FF1x1y12 ::~FF1x1y12(){ note_dtor("_ZN3ccc8FF1x1y12E", this);} // tgen
ccc::FF1x1y12 ::FF1x1y12(){ note_ctor("_ZN3ccc8FF1x1y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y12E, buf);
    ::ccc::FF1x1y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y12E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y12E);
    dp->::ccc::FF1x1y12::~FF1x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y12E(Test__ZN3ccc8FF1x1y12E, "_ZN3ccc8FF1x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y12C1Ev();
extern void _ZN3ccc8FF1x1y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y12E[] = {
  NSPAIR(_ZN3ccc8FF1x1y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y12E[];
extern void _ZN3ccc8FF1x1y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y12E[] = {
  {&(_ZTVN3ccc8FF1x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y12E[];
static VTBL_ENTRY alt_thunk_names269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y12E = {  "_ZN3ccc8FF1x1y12E", // class name
  bases__ZN3ccc8FF1x1y12E, 2,
  &(vtc__ZN3ccc8FF1x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names269,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y13  : virtual ::ccc::EE1x1 {
  virtual void  efg(); // _ZN3ccc8FF1x1y133efgEv
  ~FF1x1y13(); // tgen
  FF1x1y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x1y133efgEv");}
ccc::FF1x1y13 ::~FF1x1y13(){ note_dtor("_ZN3ccc8FF1x1y13E", this);} // tgen
ccc::FF1x1y13 ::FF1x1y13(){ note_ctor("_ZN3ccc8FF1x1y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y13E, buf);
    ::ccc::FF1x1y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y13E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y13E);
    dp->::ccc::FF1x1y13::~FF1x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y13E(Test__ZN3ccc8FF1x1y13E, "_ZN3ccc8FF1x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y13C1Ev();
extern void _ZN3ccc8FF1x1y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y13E[] = {
  NSPAIR(_ZN3ccc8FF1x1y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x1y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y13E[] = {
  {&(_ZTVN3ccc8FF1x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y13E[];
static VTBL_ENTRY alt_thunk_names270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y13E = {  "_ZN3ccc8FF1x1y13E", // class name
  bases__ZN3ccc8FF1x1y13E, 2,
  &(vtc__ZN3ccc8FF1x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names270,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y14  : virtual ::ccc::EE1x1 {
  virtual void  pqr(); // _ZN3ccc8FF1x1y143pqrEv
  ~FF1x1y14(); // tgen
  FF1x1y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x1y143pqrEv");}
ccc::FF1x1y14 ::~FF1x1y14(){ note_dtor("_ZN3ccc8FF1x1y14E", this);} // tgen
ccc::FF1x1y14 ::FF1x1y14(){ note_ctor("_ZN3ccc8FF1x1y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y14E, buf);
    ::ccc::FF1x1y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y14E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y14E);
    dp->::ccc::FF1x1y14::~FF1x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y14E(Test__ZN3ccc8FF1x1y14E, "_ZN3ccc8FF1x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y14C1Ev();
extern void _ZN3ccc8FF1x1y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y14E[] = {
  NSPAIR(_ZN3ccc8FF1x1y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x1y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x1y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y14E[] = {
  {&(_ZTVN3ccc8FF1x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y14E[];
static VTBL_ENTRY alt_thunk_names271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y14E = {  "_ZN3ccc8FF1x1y14E", // class name
  bases__ZN3ccc8FF1x1y14E, 2,
  &(vtc__ZN3ccc8FF1x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names271,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x1y15  : virtual ::ccc::EE1x1 {
  ~FF1x1y15(); // tgen
  FF1x1y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x1y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x1y15 ::~FF1x1y15(){ note_dtor("_ZN3ccc8FF1x1y15E", this);} // tgen
ccc::FF1x1y15 ::FF1x1y15(){ note_ctor("_ZN3ccc8FF1x1y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x1y15E, buf);
    ::ccc::FF1x1y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x1y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y15E");
    check_base_class_offset(lv, (::ccc::EE1x1*), 0, "_ZN3ccc8FF1x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x1y15E);
    dp->::ccc::FF1x1y15::~FF1x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x1y15E(Test__ZN3ccc8FF1x1y15E, "_ZN3ccc8FF1x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x1y15C1Ev();
extern void _ZN3ccc8FF1x1y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x1y15E[] = {
  NSPAIR(_ZN3ccc8FF1x1y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x1E[];
static Base_Class bases__ZN3ccc8FF1x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x1y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv)();
extern void _ZN3ccc5EE1x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv)();
extern void _ZN3ccc5EE1x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv)();
extern void _ZN3ccc5EE1x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x1y15E[] = {
  {&(_ZTVN3ccc8FF1x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x1y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x1E__NS_8FF1x1y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x1y15E[];
static VTBL_ENTRY alt_thunk_names272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x13efgEv,_ZTv0_n20_N3ccc5EE1x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x13pqrEv,_ZTv0_n16_N3ccc5EE1x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x13abcEv,_ZTv0_n12_N3ccc5EE1x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x1y15E = {  "_ZN3ccc8FF1x1y15E", // class name
  bases__ZN3ccc8FF1x1y15E, 2,
  &(vtc__ZN3ccc8FF1x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x1y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x1y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x1y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x1y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names272,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y0  : virtual ::ccc::EE1x2 {
  virtual void  abc(); // _ZN3ccc7FF1x2y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y03pqrEv
  ~FF1x2y0(); // tgen
  FF1x2y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y03abcEv");}
void  ccc::FF1x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y03efgEv");}
void  ccc::FF1x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y03pqrEv");}
ccc::FF1x2y0 ::~FF1x2y0(){ note_dtor("_ZN3ccc7FF1x2y0E", this);} // tgen
ccc::FF1x2y0 ::FF1x2y0(){ note_ctor("_ZN3ccc7FF1x2y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y0E, buf);
    ::ccc::FF1x2y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y0E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y0E);
    dp->::ccc::FF1x2y0::~FF1x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y0E(Test__ZN3ccc7FF1x2y0E, "_ZN3ccc7FF1x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y0C1Ev();
extern void _ZN3ccc7FF1x2y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y0E[] = {
  NSPAIR(_ZN3ccc7FF1x2y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y0E[];
extern void _ZN3ccc7FF1x2y03abcEv();
extern void _ZN3ccc7FF1x2y03pqrEv();
extern void _ZN3ccc7FF1x2y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y0E[] = {
  {&(_ZTVN3ccc7FF1x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y0E[];
static VTBL_ENTRY alt_thunk_names273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y0E = {  "_ZN3ccc7FF1x2y0E", // class name
  bases__ZN3ccc7FF1x2y0E, 2,
  &(vtc__ZN3ccc7FF1x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names273,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y1  : virtual ::ccc::EE1x2 {
  virtual void  abc(); // _ZN3ccc7FF1x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x2y13efgEv
  ~FF1x2y1(); // tgen
  FF1x2y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y13abcEv");}
void  ccc::FF1x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y13pqrEv");}
void  ccc::FF1x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y13efgEv");}
ccc::FF1x2y1 ::~FF1x2y1(){ note_dtor("_ZN3ccc7FF1x2y1E", this);} // tgen
ccc::FF1x2y1 ::FF1x2y1(){ note_ctor("_ZN3ccc7FF1x2y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y1E, buf);
    ::ccc::FF1x2y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y1E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y1E);
    dp->::ccc::FF1x2y1::~FF1x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y1E(Test__ZN3ccc7FF1x2y1E, "_ZN3ccc7FF1x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y1C1Ev();
extern void _ZN3ccc7FF1x2y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y1E[] = {
  NSPAIR(_ZN3ccc7FF1x2y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y1E[];
extern void _ZN3ccc7FF1x2y13abcEv();
extern void _ZN3ccc7FF1x2y13pqrEv();
extern void _ZN3ccc7FF1x2y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y1E[] = {
  {&(_ZTVN3ccc7FF1x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y1E[];
static VTBL_ENTRY alt_thunk_names274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y1E = {  "_ZN3ccc7FF1x2y1E", // class name
  bases__ZN3ccc7FF1x2y1E, 2,
  &(vtc__ZN3ccc7FF1x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names274,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y2  : virtual ::ccc::EE1x2 {
  virtual void  efg(); // _ZN3ccc7FF1x2y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y23pqrEv
  ~FF1x2y2(); // tgen
  FF1x2y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y23efgEv");}
void  ccc::FF1x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y23abcEv");}
void  ccc::FF1x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y23pqrEv");}
ccc::FF1x2y2 ::~FF1x2y2(){ note_dtor("_ZN3ccc7FF1x2y2E", this);} // tgen
ccc::FF1x2y2 ::FF1x2y2(){ note_ctor("_ZN3ccc7FF1x2y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y2E, buf);
    ::ccc::FF1x2y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y2E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y2E);
    dp->::ccc::FF1x2y2::~FF1x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y2E(Test__ZN3ccc7FF1x2y2E, "_ZN3ccc7FF1x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y2C1Ev();
extern void _ZN3ccc7FF1x2y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y2E[] = {
  NSPAIR(_ZN3ccc7FF1x2y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y2E[];
extern void _ZN3ccc7FF1x2y23abcEv();
extern void _ZN3ccc7FF1x2y23pqrEv();
extern void _ZN3ccc7FF1x2y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y2E[] = {
  {&(_ZTVN3ccc7FF1x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y2E[];
static VTBL_ENTRY alt_thunk_names275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y2E = {  "_ZN3ccc7FF1x2y2E", // class name
  bases__ZN3ccc7FF1x2y2E, 2,
  &(vtc__ZN3ccc7FF1x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names275,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y3  : virtual ::ccc::EE1x2 {
  virtual void  efg(); // _ZN3ccc7FF1x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x2y33abcEv
  ~FF1x2y3(); // tgen
  FF1x2y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y33efgEv");}
void  ccc::FF1x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y33pqrEv");}
void  ccc::FF1x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y33abcEv");}
ccc::FF1x2y3 ::~FF1x2y3(){ note_dtor("_ZN3ccc7FF1x2y3E", this);} // tgen
ccc::FF1x2y3 ::FF1x2y3(){ note_ctor("_ZN3ccc7FF1x2y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y3E, buf);
    ::ccc::FF1x2y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y3E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y3E);
    dp->::ccc::FF1x2y3::~FF1x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y3E(Test__ZN3ccc7FF1x2y3E, "_ZN3ccc7FF1x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y3C1Ev();
extern void _ZN3ccc7FF1x2y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y3E[] = {
  NSPAIR(_ZN3ccc7FF1x2y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y3E[];
extern void _ZN3ccc7FF1x2y33abcEv();
extern void _ZN3ccc7FF1x2y33pqrEv();
extern void _ZN3ccc7FF1x2y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y3E[] = {
  {&(_ZTVN3ccc7FF1x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y3E[];
static VTBL_ENTRY alt_thunk_names276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y3E = {  "_ZN3ccc7FF1x2y3E", // class name
  bases__ZN3ccc7FF1x2y3E, 2,
  &(vtc__ZN3ccc7FF1x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names276,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y4  : virtual ::ccc::EE1x2 {
  virtual void  pqr(); // _ZN3ccc7FF1x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x2y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x2y43efgEv
  ~FF1x2y4(); // tgen
  FF1x2y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y43pqrEv");}
void  ccc::FF1x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y43abcEv");}
void  ccc::FF1x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y43efgEv");}
ccc::FF1x2y4 ::~FF1x2y4(){ note_dtor("_ZN3ccc7FF1x2y4E", this);} // tgen
ccc::FF1x2y4 ::FF1x2y4(){ note_ctor("_ZN3ccc7FF1x2y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y4E, buf);
    ::ccc::FF1x2y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y4E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y4E);
    dp->::ccc::FF1x2y4::~FF1x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y4E(Test__ZN3ccc7FF1x2y4E, "_ZN3ccc7FF1x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y4C1Ev();
extern void _ZN3ccc7FF1x2y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y4E[] = {
  NSPAIR(_ZN3ccc7FF1x2y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y4E[];
extern void _ZN3ccc7FF1x2y43abcEv();
extern void _ZN3ccc7FF1x2y43pqrEv();
extern void _ZN3ccc7FF1x2y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y4E[] = {
  {&(_ZTVN3ccc7FF1x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y4E[];
static VTBL_ENTRY alt_thunk_names277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y4E = {  "_ZN3ccc7FF1x2y4E", // class name
  bases__ZN3ccc7FF1x2y4E, 2,
  &(vtc__ZN3ccc7FF1x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names277,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y5  : virtual ::ccc::EE1x2 {
  virtual void  pqr(); // _ZN3ccc7FF1x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x2y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x2y53abcEv
  ~FF1x2y5(); // tgen
  FF1x2y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y53pqrEv");}
void  ccc::FF1x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y53efgEv");}
void  ccc::FF1x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y53abcEv");}
ccc::FF1x2y5 ::~FF1x2y5(){ note_dtor("_ZN3ccc7FF1x2y5E", this);} // tgen
ccc::FF1x2y5 ::FF1x2y5(){ note_ctor("_ZN3ccc7FF1x2y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y5E, buf);
    ::ccc::FF1x2y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y5E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y5E);
    dp->::ccc::FF1x2y5::~FF1x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y5E(Test__ZN3ccc7FF1x2y5E, "_ZN3ccc7FF1x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y5C1Ev();
extern void _ZN3ccc7FF1x2y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y5E[] = {
  NSPAIR(_ZN3ccc7FF1x2y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y5E[];
extern void _ZN3ccc7FF1x2y53abcEv();
extern void _ZN3ccc7FF1x2y53pqrEv();
extern void _ZN3ccc7FF1x2y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y5E[] = {
  {&(_ZTVN3ccc7FF1x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y5E[];
static VTBL_ENTRY alt_thunk_names278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y5E = {  "_ZN3ccc7FF1x2y5E", // class name
  bases__ZN3ccc7FF1x2y5E, 2,
  &(vtc__ZN3ccc7FF1x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y6  : virtual ::ccc::EE1x2 {
  virtual void  abc(); // _ZN3ccc7FF1x2y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x2y63efgEv
  ~FF1x2y6(); // tgen
  FF1x2y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y63abcEv");}
void  ccc::FF1x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y63efgEv");}
ccc::FF1x2y6 ::~FF1x2y6(){ note_dtor("_ZN3ccc7FF1x2y6E", this);} // tgen
ccc::FF1x2y6 ::FF1x2y6(){ note_ctor("_ZN3ccc7FF1x2y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y6E, buf);
    ::ccc::FF1x2y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y6E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y6E);
    dp->::ccc::FF1x2y6::~FF1x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y6E(Test__ZN3ccc7FF1x2y6E, "_ZN3ccc7FF1x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y6C1Ev();
extern void _ZN3ccc7FF1x2y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y6E[] = {
  NSPAIR(_ZN3ccc7FF1x2y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y6E[];
extern void _ZN3ccc7FF1x2y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x2y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y6E[] = {
  {&(_ZTVN3ccc7FF1x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y6E[];
static VTBL_ENTRY alt_thunk_names279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y6E = {  "_ZN3ccc7FF1x2y6E", // class name
  bases__ZN3ccc7FF1x2y6E, 2,
  &(vtc__ZN3ccc7FF1x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names279,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y7  : virtual ::ccc::EE1x2 {
  virtual void  abc(); // _ZN3ccc7FF1x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y73pqrEv
  ~FF1x2y7(); // tgen
  FF1x2y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y73abcEv");}
void  ccc::FF1x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y73pqrEv");}
ccc::FF1x2y7 ::~FF1x2y7(){ note_dtor("_ZN3ccc7FF1x2y7E", this);} // tgen
ccc::FF1x2y7 ::FF1x2y7(){ note_ctor("_ZN3ccc7FF1x2y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y7E, buf);
    ::ccc::FF1x2y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y7E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y7E);
    dp->::ccc::FF1x2y7::~FF1x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y7E(Test__ZN3ccc7FF1x2y7E, "_ZN3ccc7FF1x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y7C1Ev();
extern void _ZN3ccc7FF1x2y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y7E[] = {
  NSPAIR(_ZN3ccc7FF1x2y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y7E[];
extern void _ZN3ccc7FF1x2y73abcEv();
extern void _ZN3ccc7FF1x2y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y7E[] = {
  {&(_ZTVN3ccc7FF1x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y7E[];
static VTBL_ENTRY alt_thunk_names280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y7E = {  "_ZN3ccc7FF1x2y7E", // class name
  bases__ZN3ccc7FF1x2y7E, 2,
  &(vtc__ZN3ccc7FF1x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names280,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y8  : virtual ::ccc::EE1x2 {
  virtual void  efg(); // _ZN3ccc7FF1x2y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x2y83abcEv
  ~FF1x2y8(); // tgen
  FF1x2y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y83efgEv");}
void  ccc::FF1x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x2y83abcEv");}
ccc::FF1x2y8 ::~FF1x2y8(){ note_dtor("_ZN3ccc7FF1x2y8E", this);} // tgen
ccc::FF1x2y8 ::FF1x2y8(){ note_ctor("_ZN3ccc7FF1x2y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y8E, buf);
    ::ccc::FF1x2y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y8E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y8E);
    dp->::ccc::FF1x2y8::~FF1x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y8E(Test__ZN3ccc7FF1x2y8E, "_ZN3ccc7FF1x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y8C1Ev();
extern void _ZN3ccc7FF1x2y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y8E[] = {
  NSPAIR(_ZN3ccc7FF1x2y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y8E[];
extern void _ZN3ccc7FF1x2y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x2y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y8E[] = {
  {&(_ZTVN3ccc7FF1x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y8E[];
static VTBL_ENTRY alt_thunk_names281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y8E = {  "_ZN3ccc7FF1x2y8E", // class name
  bases__ZN3ccc7FF1x2y8E, 2,
  &(vtc__ZN3ccc7FF1x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names281,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y9  : virtual ::ccc::EE1x2 {
  virtual void  efg(); // _ZN3ccc7FF1x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x2y93pqrEv
  ~FF1x2y9(); // tgen
  FF1x2y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x2y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x2y93efgEv");}
void  ccc::FF1x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x2y93pqrEv");}
ccc::FF1x2y9 ::~FF1x2y9(){ note_dtor("_ZN3ccc7FF1x2y9E", this);} // tgen
ccc::FF1x2y9 ::FF1x2y9(){ note_ctor("_ZN3ccc7FF1x2y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x2y9E, buf);
    ::ccc::FF1x2y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x2y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y9E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc7FF1x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x2y9E);
    dp->::ccc::FF1x2y9::~FF1x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x2y9E(Test__ZN3ccc7FF1x2y9E, "_ZN3ccc7FF1x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x2y9C1Ev();
extern void _ZN3ccc7FF1x2y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x2y9E[] = {
  NSPAIR(_ZN3ccc7FF1x2y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc7FF1x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x2y93pqrEv();
extern void _ZN3ccc7FF1x2y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x2y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x2y9E[] = {
  {&(_ZTVN3ccc7FF1x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x2y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_7FF1x2y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x2y9E[];
static VTBL_ENTRY alt_thunk_names282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x2y9E = {  "_ZN3ccc7FF1x2y9E", // class name
  bases__ZN3ccc7FF1x2y9E, 2,
  &(vtc__ZN3ccc7FF1x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x2y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x2y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x2y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x2y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names282,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y10  : virtual ::ccc::EE1x2 {
  virtual void  pqr(); // _ZN3ccc8FF1x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x2y103abcEv
  ~FF1x2y10(); // tgen
  FF1x2y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x2y103pqrEv");}
void  ccc::FF1x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x2y103abcEv");}
ccc::FF1x2y10 ::~FF1x2y10(){ note_dtor("_ZN3ccc8FF1x2y10E", this);} // tgen
ccc::FF1x2y10 ::FF1x2y10(){ note_ctor("_ZN3ccc8FF1x2y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y10E, buf);
    ::ccc::FF1x2y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y10E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y10E);
    dp->::ccc::FF1x2y10::~FF1x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y10E(Test__ZN3ccc8FF1x2y10E, "_ZN3ccc8FF1x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y10C1Ev();
extern void _ZN3ccc8FF1x2y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y10E[] = {
  NSPAIR(_ZN3ccc8FF1x2y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y10E[];
extern void _ZN3ccc8FF1x2y103abcEv();
extern void _ZN3ccc8FF1x2y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y10E[] = {
  {&(_ZTVN3ccc8FF1x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y10E[];
static VTBL_ENTRY alt_thunk_names283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y10E = {  "_ZN3ccc8FF1x2y10E", // class name
  bases__ZN3ccc8FF1x2y10E, 2,
  &(vtc__ZN3ccc8FF1x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names283,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y11  : virtual ::ccc::EE1x2 {
  virtual void  pqr(); // _ZN3ccc8FF1x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x2y113efgEv
  ~FF1x2y11(); // tgen
  FF1x2y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x2y113pqrEv");}
void  ccc::FF1x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x2y113efgEv");}
ccc::FF1x2y11 ::~FF1x2y11(){ note_dtor("_ZN3ccc8FF1x2y11E", this);} // tgen
ccc::FF1x2y11 ::FF1x2y11(){ note_ctor("_ZN3ccc8FF1x2y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y11E, buf);
    ::ccc::FF1x2y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y11E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y11E);
    dp->::ccc::FF1x2y11::~FF1x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y11E(Test__ZN3ccc8FF1x2y11E, "_ZN3ccc8FF1x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y11C1Ev();
extern void _ZN3ccc8FF1x2y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y11E[] = {
  NSPAIR(_ZN3ccc8FF1x2y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x2y113pqrEv();
extern void _ZN3ccc8FF1x2y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y11E[] = {
  {&(_ZTVN3ccc8FF1x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y11E[];
static VTBL_ENTRY alt_thunk_names284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y11E = {  "_ZN3ccc8FF1x2y11E", // class name
  bases__ZN3ccc8FF1x2y11E, 2,
  &(vtc__ZN3ccc8FF1x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names284,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y12  : virtual ::ccc::EE1x2 {
  virtual void  abc(); // _ZN3ccc8FF1x2y123abcEv
  ~FF1x2y12(); // tgen
  FF1x2y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x2y123abcEv");}
ccc::FF1x2y12 ::~FF1x2y12(){ note_dtor("_ZN3ccc8FF1x2y12E", this);} // tgen
ccc::FF1x2y12 ::FF1x2y12(){ note_ctor("_ZN3ccc8FF1x2y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y12E, buf);
    ::ccc::FF1x2y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y12E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y12E);
    dp->::ccc::FF1x2y12::~FF1x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y12E(Test__ZN3ccc8FF1x2y12E, "_ZN3ccc8FF1x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y12C1Ev();
extern void _ZN3ccc8FF1x2y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y12E[] = {
  NSPAIR(_ZN3ccc8FF1x2y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y12E[];
extern void _ZN3ccc8FF1x2y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y12E[] = {
  {&(_ZTVN3ccc8FF1x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y12E[];
static VTBL_ENTRY alt_thunk_names285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y12E = {  "_ZN3ccc8FF1x2y12E", // class name
  bases__ZN3ccc8FF1x2y12E, 2,
  &(vtc__ZN3ccc8FF1x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y12E),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
namespace ccc { 
struct  FF1x2y13  : virtual ::ccc::EE1x2 {
  virtual void  efg(); // _ZN3ccc8FF1x2y133efgEv
  ~FF1x2y13(); // tgen
  FF1x2y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x2y133efgEv");}
ccc::FF1x2y13 ::~FF1x2y13(){ note_dtor("_ZN3ccc8FF1x2y13E", this);} // tgen
ccc::FF1x2y13 ::FF1x2y13(){ note_ctor("_ZN3ccc8FF1x2y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y13E, buf);
    ::ccc::FF1x2y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y13E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y13E);
    dp->::ccc::FF1x2y13::~FF1x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y13E(Test__ZN3ccc8FF1x2y13E, "_ZN3ccc8FF1x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y13C1Ev();
extern void _ZN3ccc8FF1x2y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y13E[] = {
  NSPAIR(_ZN3ccc8FF1x2y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x2y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y13E[] = {
  {&(_ZTVN3ccc8FF1x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y13E[];
static VTBL_ENTRY alt_thunk_names286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y13E = {  "_ZN3ccc8FF1x2y13E", // class name
  bases__ZN3ccc8FF1x2y13E, 2,
  &(vtc__ZN3ccc8FF1x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names286,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y14  : virtual ::ccc::EE1x2 {
  virtual void  pqr(); // _ZN3ccc8FF1x2y143pqrEv
  ~FF1x2y14(); // tgen
  FF1x2y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x2y143pqrEv");}
ccc::FF1x2y14 ::~FF1x2y14(){ note_dtor("_ZN3ccc8FF1x2y14E", this);} // tgen
ccc::FF1x2y14 ::FF1x2y14(){ note_ctor("_ZN3ccc8FF1x2y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y14E, buf);
    ::ccc::FF1x2y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y14E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y14E);
    dp->::ccc::FF1x2y14::~FF1x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y14E(Test__ZN3ccc8FF1x2y14E, "_ZN3ccc8FF1x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y14C1Ev();
extern void _ZN3ccc8FF1x2y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y14E[] = {
  NSPAIR(_ZN3ccc8FF1x2y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x2y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x2y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y14E[] = {
  {&(_ZTVN3ccc8FF1x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y14E[];
static VTBL_ENTRY alt_thunk_names287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y14E = {  "_ZN3ccc8FF1x2y14E", // class name
  bases__ZN3ccc8FF1x2y14E, 2,
  &(vtc__ZN3ccc8FF1x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names287,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x2y15  : virtual ::ccc::EE1x2 {
  ~FF1x2y15(); // tgen
  FF1x2y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x2y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x2y15 ::~FF1x2y15(){ note_dtor("_ZN3ccc8FF1x2y15E", this);} // tgen
ccc::FF1x2y15 ::FF1x2y15(){ note_ctor("_ZN3ccc8FF1x2y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x2y15E, buf);
    ::ccc::FF1x2y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x2y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y15E");
    check_base_class_offset(lv, (::ccc::EE1x2*), 0, "_ZN3ccc8FF1x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x2y15E);
    dp->::ccc::FF1x2y15::~FF1x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x2y15E(Test__ZN3ccc8FF1x2y15E, "_ZN3ccc8FF1x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x2y15C1Ev();
extern void _ZN3ccc8FF1x2y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x2y15E[] = {
  NSPAIR(_ZN3ccc8FF1x2y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x2E[];
static Base_Class bases__ZN3ccc8FF1x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x2y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv)();
extern void _ZN3ccc5EE1x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv)();
extern void _ZN3ccc5EE1x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv)();
extern void _ZN3ccc5EE1x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x2y15E[] = {
  {&(_ZTVN3ccc8FF1x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x2y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x2E__NS_8FF1x2y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x2y15E[];
static VTBL_ENTRY alt_thunk_names288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x23efgEv,_ZTv0_n20_N3ccc5EE1x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x23pqrEv,_ZTv0_n16_N3ccc5EE1x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x23abcEv,_ZTv0_n12_N3ccc5EE1x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x2y15E = {  "_ZN3ccc8FF1x2y15E", // class name
  bases__ZN3ccc8FF1x2y15E, 2,
  &(vtc__ZN3ccc8FF1x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x2y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x2y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x2y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x2y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names288,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y0  : virtual ::ccc::EE1x3 {
  virtual void  abc(); // _ZN3ccc7FF1x3y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y03pqrEv
  ~FF1x3y0(); // tgen
  FF1x3y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y03abcEv");}
void  ccc::FF1x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y03efgEv");}
void  ccc::FF1x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y03pqrEv");}
ccc::FF1x3y0 ::~FF1x3y0(){ note_dtor("_ZN3ccc7FF1x3y0E", this);} // tgen
ccc::FF1x3y0 ::FF1x3y0(){ note_ctor("_ZN3ccc7FF1x3y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y0E, buf);
    ::ccc::FF1x3y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y0E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y0E);
    dp->::ccc::FF1x3y0::~FF1x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y0E(Test__ZN3ccc7FF1x3y0E, "_ZN3ccc7FF1x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y0C1Ev();
extern void _ZN3ccc7FF1x3y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y0E[] = {
  NSPAIR(_ZN3ccc7FF1x3y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y0E[];
extern void _ZN3ccc7FF1x3y03abcEv();
extern void _ZN3ccc7FF1x3y03pqrEv();
extern void _ZN3ccc7FF1x3y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y0E[] = {
  {&(_ZTVN3ccc7FF1x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y0E[];
static VTBL_ENTRY alt_thunk_names289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y0E = {  "_ZN3ccc7FF1x3y0E", // class name
  bases__ZN3ccc7FF1x3y0E, 2,
  &(vtc__ZN3ccc7FF1x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names289,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y1  : virtual ::ccc::EE1x3 {
  virtual void  abc(); // _ZN3ccc7FF1x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x3y13efgEv
  ~FF1x3y1(); // tgen
  FF1x3y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y13abcEv");}
void  ccc::FF1x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y13pqrEv");}
void  ccc::FF1x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y13efgEv");}
ccc::FF1x3y1 ::~FF1x3y1(){ note_dtor("_ZN3ccc7FF1x3y1E", this);} // tgen
ccc::FF1x3y1 ::FF1x3y1(){ note_ctor("_ZN3ccc7FF1x3y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y1E, buf);
    ::ccc::FF1x3y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y1E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y1E);
    dp->::ccc::FF1x3y1::~FF1x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y1E(Test__ZN3ccc7FF1x3y1E, "_ZN3ccc7FF1x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y1C1Ev();
extern void _ZN3ccc7FF1x3y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y1E[] = {
  NSPAIR(_ZN3ccc7FF1x3y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y1E[];
extern void _ZN3ccc7FF1x3y13abcEv();
extern void _ZN3ccc7FF1x3y13pqrEv();
extern void _ZN3ccc7FF1x3y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y1E[] = {
  {&(_ZTVN3ccc7FF1x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y1E[];
static VTBL_ENTRY alt_thunk_names290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y1E = {  "_ZN3ccc7FF1x3y1E", // class name
  bases__ZN3ccc7FF1x3y1E, 2,
  &(vtc__ZN3ccc7FF1x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names290,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y2  : virtual ::ccc::EE1x3 {
  virtual void  efg(); // _ZN3ccc7FF1x3y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y23pqrEv
  ~FF1x3y2(); // tgen
  FF1x3y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y23efgEv");}
void  ccc::FF1x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y23abcEv");}
void  ccc::FF1x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y23pqrEv");}
ccc::FF1x3y2 ::~FF1x3y2(){ note_dtor("_ZN3ccc7FF1x3y2E", this);} // tgen
ccc::FF1x3y2 ::FF1x3y2(){ note_ctor("_ZN3ccc7FF1x3y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y2E, buf);
    ::ccc::FF1x3y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y2E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y2E);
    dp->::ccc::FF1x3y2::~FF1x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y2E(Test__ZN3ccc7FF1x3y2E, "_ZN3ccc7FF1x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y2C1Ev();
extern void _ZN3ccc7FF1x3y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y2E[] = {
  NSPAIR(_ZN3ccc7FF1x3y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y2E[];
extern void _ZN3ccc7FF1x3y23abcEv();
extern void _ZN3ccc7FF1x3y23pqrEv();
extern void _ZN3ccc7FF1x3y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y2E[] = {
  {&(_ZTVN3ccc7FF1x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y2E[];
static VTBL_ENTRY alt_thunk_names291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y2E = {  "_ZN3ccc7FF1x3y2E", // class name
  bases__ZN3ccc7FF1x3y2E, 2,
  &(vtc__ZN3ccc7FF1x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names291,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y3  : virtual ::ccc::EE1x3 {
  virtual void  efg(); // _ZN3ccc7FF1x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x3y33abcEv
  ~FF1x3y3(); // tgen
  FF1x3y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y33efgEv");}
void  ccc::FF1x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y33pqrEv");}
void  ccc::FF1x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y33abcEv");}
ccc::FF1x3y3 ::~FF1x3y3(){ note_dtor("_ZN3ccc7FF1x3y3E", this);} // tgen
ccc::FF1x3y3 ::FF1x3y3(){ note_ctor("_ZN3ccc7FF1x3y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y3E, buf);
    ::ccc::FF1x3y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y3E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y3E);
    dp->::ccc::FF1x3y3::~FF1x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y3E(Test__ZN3ccc7FF1x3y3E, "_ZN3ccc7FF1x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y3C1Ev();
extern void _ZN3ccc7FF1x3y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y3E[] = {
  NSPAIR(_ZN3ccc7FF1x3y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y3E[];
extern void _ZN3ccc7FF1x3y33abcEv();
extern void _ZN3ccc7FF1x3y33pqrEv();
extern void _ZN3ccc7FF1x3y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y3E[] = {
  {&(_ZTVN3ccc7FF1x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y3E[];
static VTBL_ENTRY alt_thunk_names292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y3E = {  "_ZN3ccc7FF1x3y3E", // class name
  bases__ZN3ccc7FF1x3y3E, 2,
  &(vtc__ZN3ccc7FF1x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names292,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y4  : virtual ::ccc::EE1x3 {
  virtual void  pqr(); // _ZN3ccc7FF1x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x3y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x3y43efgEv
  ~FF1x3y4(); // tgen
  FF1x3y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y43pqrEv");}
void  ccc::FF1x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y43abcEv");}
void  ccc::FF1x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y43efgEv");}
ccc::FF1x3y4 ::~FF1x3y4(){ note_dtor("_ZN3ccc7FF1x3y4E", this);} // tgen
ccc::FF1x3y4 ::FF1x3y4(){ note_ctor("_ZN3ccc7FF1x3y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y4E, buf);
    ::ccc::FF1x3y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y4E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y4E);
    dp->::ccc::FF1x3y4::~FF1x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y4E(Test__ZN3ccc7FF1x3y4E, "_ZN3ccc7FF1x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y4C1Ev();
extern void _ZN3ccc7FF1x3y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y4E[] = {
  NSPAIR(_ZN3ccc7FF1x3y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y4E[];
extern void _ZN3ccc7FF1x3y43abcEv();
extern void _ZN3ccc7FF1x3y43pqrEv();
extern void _ZN3ccc7FF1x3y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y4E[] = {
  {&(_ZTVN3ccc7FF1x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y4E[];
static VTBL_ENTRY alt_thunk_names293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y4E = {  "_ZN3ccc7FF1x3y4E", // class name
  bases__ZN3ccc7FF1x3y4E, 2,
  &(vtc__ZN3ccc7FF1x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names293,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y5  : virtual ::ccc::EE1x3 {
  virtual void  pqr(); // _ZN3ccc7FF1x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x3y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x3y53abcEv
  ~FF1x3y5(); // tgen
  FF1x3y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y53pqrEv");}
void  ccc::FF1x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y53efgEv");}
void  ccc::FF1x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y53abcEv");}
ccc::FF1x3y5 ::~FF1x3y5(){ note_dtor("_ZN3ccc7FF1x3y5E", this);} // tgen
ccc::FF1x3y5 ::FF1x3y5(){ note_ctor("_ZN3ccc7FF1x3y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y5E, buf);
    ::ccc::FF1x3y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y5E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y5E);
    dp->::ccc::FF1x3y5::~FF1x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y5E(Test__ZN3ccc7FF1x3y5E, "_ZN3ccc7FF1x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y5C1Ev();
extern void _ZN3ccc7FF1x3y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y5E[] = {
  NSPAIR(_ZN3ccc7FF1x3y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y5E[];
extern void _ZN3ccc7FF1x3y53abcEv();
extern void _ZN3ccc7FF1x3y53pqrEv();
extern void _ZN3ccc7FF1x3y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y5E[] = {
  {&(_ZTVN3ccc7FF1x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y5E[];
static VTBL_ENTRY alt_thunk_names294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y5E = {  "_ZN3ccc7FF1x3y5E", // class name
  bases__ZN3ccc7FF1x3y5E, 2,
  &(vtc__ZN3ccc7FF1x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names294,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y6  : virtual ::ccc::EE1x3 {
  virtual void  abc(); // _ZN3ccc7FF1x3y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x3y63efgEv
  ~FF1x3y6(); // tgen
  FF1x3y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y63abcEv");}
void  ccc::FF1x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y63efgEv");}
ccc::FF1x3y6 ::~FF1x3y6(){ note_dtor("_ZN3ccc7FF1x3y6E", this);} // tgen
ccc::FF1x3y6 ::FF1x3y6(){ note_ctor("_ZN3ccc7FF1x3y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y6E, buf);
    ::ccc::FF1x3y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y6E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y6E);
    dp->::ccc::FF1x3y6::~FF1x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y6E(Test__ZN3ccc7FF1x3y6E, "_ZN3ccc7FF1x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y6C1Ev();
extern void _ZN3ccc7FF1x3y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y6E[] = {
  NSPAIR(_ZN3ccc7FF1x3y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y6E[];
extern void _ZN3ccc7FF1x3y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x3y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y6E[] = {
  {&(_ZTVN3ccc7FF1x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y6E[];
static VTBL_ENTRY alt_thunk_names295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y6E = {  "_ZN3ccc7FF1x3y6E", // class name
  bases__ZN3ccc7FF1x3y6E, 2,
  &(vtc__ZN3ccc7FF1x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names295,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y7  : virtual ::ccc::EE1x3 {
  virtual void  abc(); // _ZN3ccc7FF1x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y73pqrEv
  ~FF1x3y7(); // tgen
  FF1x3y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y73abcEv");}
void  ccc::FF1x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y73pqrEv");}
ccc::FF1x3y7 ::~FF1x3y7(){ note_dtor("_ZN3ccc7FF1x3y7E", this);} // tgen
ccc::FF1x3y7 ::FF1x3y7(){ note_ctor("_ZN3ccc7FF1x3y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y7E, buf);
    ::ccc::FF1x3y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y7E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y7E);
    dp->::ccc::FF1x3y7::~FF1x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y7E(Test__ZN3ccc7FF1x3y7E, "_ZN3ccc7FF1x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y7C1Ev();
extern void _ZN3ccc7FF1x3y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y7E[] = {
  NSPAIR(_ZN3ccc7FF1x3y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y7E[];
extern void _ZN3ccc7FF1x3y73abcEv();
extern void _ZN3ccc7FF1x3y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y7E[] = {
  {&(_ZTVN3ccc7FF1x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y7E[];
static VTBL_ENTRY alt_thunk_names296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y7E = {  "_ZN3ccc7FF1x3y7E", // class name
  bases__ZN3ccc7FF1x3y7E, 2,
  &(vtc__ZN3ccc7FF1x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y8  : virtual ::ccc::EE1x3 {
  virtual void  efg(); // _ZN3ccc7FF1x3y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x3y83abcEv
  ~FF1x3y8(); // tgen
  FF1x3y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y83efgEv");}
void  ccc::FF1x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x3y83abcEv");}
ccc::FF1x3y8 ::~FF1x3y8(){ note_dtor("_ZN3ccc7FF1x3y8E", this);} // tgen
ccc::FF1x3y8 ::FF1x3y8(){ note_ctor("_ZN3ccc7FF1x3y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y8E, buf);
    ::ccc::FF1x3y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y8E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y8E);
    dp->::ccc::FF1x3y8::~FF1x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y8E(Test__ZN3ccc7FF1x3y8E, "_ZN3ccc7FF1x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y8C1Ev();
extern void _ZN3ccc7FF1x3y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y8E[] = {
  NSPAIR(_ZN3ccc7FF1x3y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y8E[];
extern void _ZN3ccc7FF1x3y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x3y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y8E[] = {
  {&(_ZTVN3ccc7FF1x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y8E[];
static VTBL_ENTRY alt_thunk_names297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y8E = {  "_ZN3ccc7FF1x3y8E", // class name
  bases__ZN3ccc7FF1x3y8E, 2,
  &(vtc__ZN3ccc7FF1x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names297,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y9  : virtual ::ccc::EE1x3 {
  virtual void  efg(); // _ZN3ccc7FF1x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x3y93pqrEv
  ~FF1x3y9(); // tgen
  FF1x3y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x3y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x3y93efgEv");}
void  ccc::FF1x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x3y93pqrEv");}
ccc::FF1x3y9 ::~FF1x3y9(){ note_dtor("_ZN3ccc7FF1x3y9E", this);} // tgen
ccc::FF1x3y9 ::FF1x3y9(){ note_ctor("_ZN3ccc7FF1x3y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x3y9E, buf);
    ::ccc::FF1x3y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x3y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y9E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc7FF1x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x3y9E);
    dp->::ccc::FF1x3y9::~FF1x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x3y9E(Test__ZN3ccc7FF1x3y9E, "_ZN3ccc7FF1x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x3y9C1Ev();
extern void _ZN3ccc7FF1x3y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x3y9E[] = {
  NSPAIR(_ZN3ccc7FF1x3y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc7FF1x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x3y93pqrEv();
extern void _ZN3ccc7FF1x3y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x3y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x3y9E[] = {
  {&(_ZTVN3ccc7FF1x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x3y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_7FF1x3y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x3y9E[];
static VTBL_ENTRY alt_thunk_names298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x3y9E = {  "_ZN3ccc7FF1x3y9E", // class name
  bases__ZN3ccc7FF1x3y9E, 2,
  &(vtc__ZN3ccc7FF1x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x3y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x3y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x3y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x3y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names298,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y10  : virtual ::ccc::EE1x3 {
  virtual void  pqr(); // _ZN3ccc8FF1x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x3y103abcEv
  ~FF1x3y10(); // tgen
  FF1x3y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x3y103pqrEv");}
void  ccc::FF1x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x3y103abcEv");}
ccc::FF1x3y10 ::~FF1x3y10(){ note_dtor("_ZN3ccc8FF1x3y10E", this);} // tgen
ccc::FF1x3y10 ::FF1x3y10(){ note_ctor("_ZN3ccc8FF1x3y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y10E, buf);
    ::ccc::FF1x3y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y10E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y10E);
    dp->::ccc::FF1x3y10::~FF1x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y10E(Test__ZN3ccc8FF1x3y10E, "_ZN3ccc8FF1x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y10C1Ev();
extern void _ZN3ccc8FF1x3y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y10E[] = {
  NSPAIR(_ZN3ccc8FF1x3y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y10E[];
extern void _ZN3ccc8FF1x3y103abcEv();
extern void _ZN3ccc8FF1x3y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y10E[] = {
  {&(_ZTVN3ccc8FF1x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y10E[];
static VTBL_ENTRY alt_thunk_names299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y10E = {  "_ZN3ccc8FF1x3y10E", // class name
  bases__ZN3ccc8FF1x3y10E, 2,
  &(vtc__ZN3ccc8FF1x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names299,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y11  : virtual ::ccc::EE1x3 {
  virtual void  pqr(); // _ZN3ccc8FF1x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x3y113efgEv
  ~FF1x3y11(); // tgen
  FF1x3y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x3y113pqrEv");}
void  ccc::FF1x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x3y113efgEv");}
ccc::FF1x3y11 ::~FF1x3y11(){ note_dtor("_ZN3ccc8FF1x3y11E", this);} // tgen
ccc::FF1x3y11 ::FF1x3y11(){ note_ctor("_ZN3ccc8FF1x3y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y11E, buf);
    ::ccc::FF1x3y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y11E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y11E);
    dp->::ccc::FF1x3y11::~FF1x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y11E(Test__ZN3ccc8FF1x3y11E, "_ZN3ccc8FF1x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y11C1Ev();
extern void _ZN3ccc8FF1x3y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y11E[] = {
  NSPAIR(_ZN3ccc8FF1x3y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x3y113pqrEv();
extern void _ZN3ccc8FF1x3y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y11E[] = {
  {&(_ZTVN3ccc8FF1x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y11E[];
static VTBL_ENTRY alt_thunk_names300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y11E = {  "_ZN3ccc8FF1x3y11E", // class name
  bases__ZN3ccc8FF1x3y11E, 2,
  &(vtc__ZN3ccc8FF1x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names300,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y12  : virtual ::ccc::EE1x3 {
  virtual void  abc(); // _ZN3ccc8FF1x3y123abcEv
  ~FF1x3y12(); // tgen
  FF1x3y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x3y123abcEv");}
ccc::FF1x3y12 ::~FF1x3y12(){ note_dtor("_ZN3ccc8FF1x3y12E", this);} // tgen
ccc::FF1x3y12 ::FF1x3y12(){ note_ctor("_ZN3ccc8FF1x3y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y12E, buf);
    ::ccc::FF1x3y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y12E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y12E);
    dp->::ccc::FF1x3y12::~FF1x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y12E(Test__ZN3ccc8FF1x3y12E, "_ZN3ccc8FF1x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y12C1Ev();
extern void _ZN3ccc8FF1x3y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y12E[] = {
  NSPAIR(_ZN3ccc8FF1x3y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y12E[];
extern void _ZN3ccc8FF1x3y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y12E[] = {
  {&(_ZTVN3ccc8FF1x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y12E[];
static VTBL_ENTRY alt_thunk_names301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y12E = {  "_ZN3ccc8FF1x3y12E", // class name
  bases__ZN3ccc8FF1x3y12E, 2,
  &(vtc__ZN3ccc8FF1x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names301,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y13  : virtual ::ccc::EE1x3 {
  virtual void  efg(); // _ZN3ccc8FF1x3y133efgEv
  ~FF1x3y13(); // tgen
  FF1x3y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x3y133efgEv");}
ccc::FF1x3y13 ::~FF1x3y13(){ note_dtor("_ZN3ccc8FF1x3y13E", this);} // tgen
ccc::FF1x3y13 ::FF1x3y13(){ note_ctor("_ZN3ccc8FF1x3y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y13E, buf);
    ::ccc::FF1x3y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y13E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y13E);
    dp->::ccc::FF1x3y13::~FF1x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y13E(Test__ZN3ccc8FF1x3y13E, "_ZN3ccc8FF1x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y13C1Ev();
extern void _ZN3ccc8FF1x3y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y13E[] = {
  NSPAIR(_ZN3ccc8FF1x3y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x3y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y13E[] = {
  {&(_ZTVN3ccc8FF1x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y13E[];
static VTBL_ENTRY alt_thunk_names302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y13E = {  "_ZN3ccc8FF1x3y13E", // class name
  bases__ZN3ccc8FF1x3y13E, 2,
  &(vtc__ZN3ccc8FF1x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names302,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x3y14  : virtual ::ccc::EE1x3 {
  virtual void  pqr(); // _ZN3ccc8FF1x3y143pqrEv
  ~FF1x3y14(); // tgen
  FF1x3y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x3y143pqrEv");}
ccc::FF1x3y14 ::~FF1x3y14(){ note_dtor("_ZN3ccc8FF1x3y14E", this);} // tgen
ccc::FF1x3y14 ::FF1x3y14(){ note_ctor("_ZN3ccc8FF1x3y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y14E, buf);
    ::ccc::FF1x3y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y14E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y14E);
    dp->::ccc::FF1x3y14::~FF1x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y14E(Test__ZN3ccc8FF1x3y14E, "_ZN3ccc8FF1x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y14C1Ev();
extern void _ZN3ccc8FF1x3y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y14E[] = {
  NSPAIR(_ZN3ccc8FF1x3y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x3y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x3y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y14E[] = {
  {&(_ZTVN3ccc8FF1x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y14E[];
static VTBL_ENTRY alt_thunk_names303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y14E = {  "_ZN3ccc8FF1x3y14E", // class name
  bases__ZN3ccc8FF1x3y14E, 2,
  &(vtc__ZN3ccc8FF1x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y14E),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
namespace ccc { 
struct  FF1x3y15  : virtual ::ccc::EE1x3 {
  ~FF1x3y15(); // tgen
  FF1x3y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x3y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x3y15 ::~FF1x3y15(){ note_dtor("_ZN3ccc8FF1x3y15E", this);} // tgen
ccc::FF1x3y15 ::FF1x3y15(){ note_ctor("_ZN3ccc8FF1x3y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x3y15E, buf);
    ::ccc::FF1x3y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x3y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y15E");
    check_base_class_offset(lv, (::ccc::EE1x3*), 0, "_ZN3ccc8FF1x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x3y15E);
    dp->::ccc::FF1x3y15::~FF1x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x3y15E(Test__ZN3ccc8FF1x3y15E, "_ZN3ccc8FF1x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x3y15C1Ev();
extern void _ZN3ccc8FF1x3y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x3y15E[] = {
  NSPAIR(_ZN3ccc8FF1x3y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x3E[];
static Base_Class bases__ZN3ccc8FF1x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x3y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv)();
extern void _ZN3ccc5EE1x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv)();
extern void _ZN3ccc5EE1x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv)();
extern void _ZN3ccc5EE1x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x3y15E[] = {
  {&(_ZTVN3ccc8FF1x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x3y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x3E__NS_8FF1x3y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x3y15E[];
static VTBL_ENTRY alt_thunk_names304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x33efgEv,_ZTv0_n20_N3ccc5EE1x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x33pqrEv,_ZTv0_n16_N3ccc5EE1x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x33abcEv,_ZTv0_n12_N3ccc5EE1x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x3y15E = {  "_ZN3ccc8FF1x3y15E", // class name
  bases__ZN3ccc8FF1x3y15E, 2,
  &(vtc__ZN3ccc8FF1x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x3y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x3y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x3y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x3y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names304,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y0  : virtual ::ccc::EE1x4 {
  virtual void  abc(); // _ZN3ccc7FF1x4y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y03pqrEv
  ~FF1x4y0(); // tgen
  FF1x4y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y03abcEv");}
void  ccc::FF1x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y03efgEv");}
void  ccc::FF1x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y03pqrEv");}
ccc::FF1x4y0 ::~FF1x4y0(){ note_dtor("_ZN3ccc7FF1x4y0E", this);} // tgen
ccc::FF1x4y0 ::FF1x4y0(){ note_ctor("_ZN3ccc7FF1x4y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y0E, buf);
    ::ccc::FF1x4y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y0E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y0E);
    dp->::ccc::FF1x4y0::~FF1x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y0E(Test__ZN3ccc7FF1x4y0E, "_ZN3ccc7FF1x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y0C1Ev();
extern void _ZN3ccc7FF1x4y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y0E[] = {
  NSPAIR(_ZN3ccc7FF1x4y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y0E[];
extern void _ZN3ccc7FF1x4y03abcEv();
extern void _ZN3ccc7FF1x4y03pqrEv();
extern void _ZN3ccc7FF1x4y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y0E[] = {
  {&(_ZTVN3ccc7FF1x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y0E[];
static VTBL_ENTRY alt_thunk_names305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y0E = {  "_ZN3ccc7FF1x4y0E", // class name
  bases__ZN3ccc7FF1x4y0E, 2,
  &(vtc__ZN3ccc7FF1x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names305,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y1  : virtual ::ccc::EE1x4 {
  virtual void  abc(); // _ZN3ccc7FF1x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x4y13efgEv
  ~FF1x4y1(); // tgen
  FF1x4y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y13abcEv");}
void  ccc::FF1x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y13pqrEv");}
void  ccc::FF1x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y13efgEv");}
ccc::FF1x4y1 ::~FF1x4y1(){ note_dtor("_ZN3ccc7FF1x4y1E", this);} // tgen
ccc::FF1x4y1 ::FF1x4y1(){ note_ctor("_ZN3ccc7FF1x4y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y1E, buf);
    ::ccc::FF1x4y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y1E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y1E);
    dp->::ccc::FF1x4y1::~FF1x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y1E(Test__ZN3ccc7FF1x4y1E, "_ZN3ccc7FF1x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y1C1Ev();
extern void _ZN3ccc7FF1x4y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y1E[] = {
  NSPAIR(_ZN3ccc7FF1x4y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y1E[];
extern void _ZN3ccc7FF1x4y13abcEv();
extern void _ZN3ccc7FF1x4y13pqrEv();
extern void _ZN3ccc7FF1x4y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y1E[] = {
  {&(_ZTVN3ccc7FF1x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y1E[];
static VTBL_ENTRY alt_thunk_names306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y1E = {  "_ZN3ccc7FF1x4y1E", // class name
  bases__ZN3ccc7FF1x4y1E, 2,
  &(vtc__ZN3ccc7FF1x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names306,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y2  : virtual ::ccc::EE1x4 {
  virtual void  efg(); // _ZN3ccc7FF1x4y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y23pqrEv
  ~FF1x4y2(); // tgen
  FF1x4y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y23efgEv");}
void  ccc::FF1x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y23abcEv");}
void  ccc::FF1x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y23pqrEv");}
ccc::FF1x4y2 ::~FF1x4y2(){ note_dtor("_ZN3ccc7FF1x4y2E", this);} // tgen
ccc::FF1x4y2 ::FF1x4y2(){ note_ctor("_ZN3ccc7FF1x4y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y2E, buf);
    ::ccc::FF1x4y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y2E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y2E);
    dp->::ccc::FF1x4y2::~FF1x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y2E(Test__ZN3ccc7FF1x4y2E, "_ZN3ccc7FF1x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y2C1Ev();
extern void _ZN3ccc7FF1x4y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y2E[] = {
  NSPAIR(_ZN3ccc7FF1x4y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y2E[];
extern void _ZN3ccc7FF1x4y23abcEv();
extern void _ZN3ccc7FF1x4y23pqrEv();
extern void _ZN3ccc7FF1x4y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y2E[] = {
  {&(_ZTVN3ccc7FF1x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y2E[];
static VTBL_ENTRY alt_thunk_names307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y2E = {  "_ZN3ccc7FF1x4y2E", // class name
  bases__ZN3ccc7FF1x4y2E, 2,
  &(vtc__ZN3ccc7FF1x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names307,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y3  : virtual ::ccc::EE1x4 {
  virtual void  efg(); // _ZN3ccc7FF1x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x4y33abcEv
  ~FF1x4y3(); // tgen
  FF1x4y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y33efgEv");}
void  ccc::FF1x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y33pqrEv");}
void  ccc::FF1x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y33abcEv");}
ccc::FF1x4y3 ::~FF1x4y3(){ note_dtor("_ZN3ccc7FF1x4y3E", this);} // tgen
ccc::FF1x4y3 ::FF1x4y3(){ note_ctor("_ZN3ccc7FF1x4y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y3E, buf);
    ::ccc::FF1x4y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y3E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y3E);
    dp->::ccc::FF1x4y3::~FF1x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y3E(Test__ZN3ccc7FF1x4y3E, "_ZN3ccc7FF1x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y3C1Ev();
extern void _ZN3ccc7FF1x4y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y3E[] = {
  NSPAIR(_ZN3ccc7FF1x4y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y3E[];
extern void _ZN3ccc7FF1x4y33abcEv();
extern void _ZN3ccc7FF1x4y33pqrEv();
extern void _ZN3ccc7FF1x4y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y3E[] = {
  {&(_ZTVN3ccc7FF1x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y3E[];
static VTBL_ENTRY alt_thunk_names308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y3E = {  "_ZN3ccc7FF1x4y3E", // class name
  bases__ZN3ccc7FF1x4y3E, 2,
  &(vtc__ZN3ccc7FF1x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names308,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y4  : virtual ::ccc::EE1x4 {
  virtual void  pqr(); // _ZN3ccc7FF1x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x4y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x4y43efgEv
  ~FF1x4y4(); // tgen
  FF1x4y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y43pqrEv");}
void  ccc::FF1x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y43abcEv");}
void  ccc::FF1x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y43efgEv");}
ccc::FF1x4y4 ::~FF1x4y4(){ note_dtor("_ZN3ccc7FF1x4y4E", this);} // tgen
ccc::FF1x4y4 ::FF1x4y4(){ note_ctor("_ZN3ccc7FF1x4y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y4E, buf);
    ::ccc::FF1x4y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y4E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y4E);
    dp->::ccc::FF1x4y4::~FF1x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y4E(Test__ZN3ccc7FF1x4y4E, "_ZN3ccc7FF1x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y4C1Ev();
extern void _ZN3ccc7FF1x4y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y4E[] = {
  NSPAIR(_ZN3ccc7FF1x4y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y4E[];
extern void _ZN3ccc7FF1x4y43abcEv();
extern void _ZN3ccc7FF1x4y43pqrEv();
extern void _ZN3ccc7FF1x4y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y4E[] = {
  {&(_ZTVN3ccc7FF1x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y4E[];
static VTBL_ENTRY alt_thunk_names309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y4E = {  "_ZN3ccc7FF1x4y4E", // class name
  bases__ZN3ccc7FF1x4y4E, 2,
  &(vtc__ZN3ccc7FF1x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names309,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y5  : virtual ::ccc::EE1x4 {
  virtual void  pqr(); // _ZN3ccc7FF1x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x4y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x4y53abcEv
  ~FF1x4y5(); // tgen
  FF1x4y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y53pqrEv");}
void  ccc::FF1x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y53efgEv");}
void  ccc::FF1x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y53abcEv");}
ccc::FF1x4y5 ::~FF1x4y5(){ note_dtor("_ZN3ccc7FF1x4y5E", this);} // tgen
ccc::FF1x4y5 ::FF1x4y5(){ note_ctor("_ZN3ccc7FF1x4y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y5E, buf);
    ::ccc::FF1x4y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y5E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y5E);
    dp->::ccc::FF1x4y5::~FF1x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y5E(Test__ZN3ccc7FF1x4y5E, "_ZN3ccc7FF1x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y5C1Ev();
extern void _ZN3ccc7FF1x4y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y5E[] = {
  NSPAIR(_ZN3ccc7FF1x4y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y5E[];
extern void _ZN3ccc7FF1x4y53abcEv();
extern void _ZN3ccc7FF1x4y53pqrEv();
extern void _ZN3ccc7FF1x4y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y5E[] = {
  {&(_ZTVN3ccc7FF1x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y5E[];
static VTBL_ENTRY alt_thunk_names310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y5E = {  "_ZN3ccc7FF1x4y5E", // class name
  bases__ZN3ccc7FF1x4y5E, 2,
  &(vtc__ZN3ccc7FF1x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names310,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y6  : virtual ::ccc::EE1x4 {
  virtual void  abc(); // _ZN3ccc7FF1x4y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x4y63efgEv
  ~FF1x4y6(); // tgen
  FF1x4y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y63abcEv");}
void  ccc::FF1x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y63efgEv");}
ccc::FF1x4y6 ::~FF1x4y6(){ note_dtor("_ZN3ccc7FF1x4y6E", this);} // tgen
ccc::FF1x4y6 ::FF1x4y6(){ note_ctor("_ZN3ccc7FF1x4y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y6E, buf);
    ::ccc::FF1x4y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y6E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y6E);
    dp->::ccc::FF1x4y6::~FF1x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y6E(Test__ZN3ccc7FF1x4y6E, "_ZN3ccc7FF1x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y6C1Ev();
extern void _ZN3ccc7FF1x4y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y6E[] = {
  NSPAIR(_ZN3ccc7FF1x4y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y6E[];
extern void _ZN3ccc7FF1x4y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x4y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y6E[] = {
  {&(_ZTVN3ccc7FF1x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y6E[];
static VTBL_ENTRY alt_thunk_names311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y6E = {  "_ZN3ccc7FF1x4y6E", // class name
  bases__ZN3ccc7FF1x4y6E, 2,
  &(vtc__ZN3ccc7FF1x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names311,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y7  : virtual ::ccc::EE1x4 {
  virtual void  abc(); // _ZN3ccc7FF1x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y73pqrEv
  ~FF1x4y7(); // tgen
  FF1x4y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y73abcEv");}
void  ccc::FF1x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y73pqrEv");}
ccc::FF1x4y7 ::~FF1x4y7(){ note_dtor("_ZN3ccc7FF1x4y7E", this);} // tgen
ccc::FF1x4y7 ::FF1x4y7(){ note_ctor("_ZN3ccc7FF1x4y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y7E, buf);
    ::ccc::FF1x4y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y7E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y7E);
    dp->::ccc::FF1x4y7::~FF1x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y7E(Test__ZN3ccc7FF1x4y7E, "_ZN3ccc7FF1x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y7C1Ev();
extern void _ZN3ccc7FF1x4y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y7E[] = {
  NSPAIR(_ZN3ccc7FF1x4y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y7E[];
extern void _ZN3ccc7FF1x4y73abcEv();
extern void _ZN3ccc7FF1x4y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y7E[] = {
  {&(_ZTVN3ccc7FF1x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y7E[];
static VTBL_ENTRY alt_thunk_names312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y7E = {  "_ZN3ccc7FF1x4y7E", // class name
  bases__ZN3ccc7FF1x4y7E, 2,
  &(vtc__ZN3ccc7FF1x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names312,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y8  : virtual ::ccc::EE1x4 {
  virtual void  efg(); // _ZN3ccc7FF1x4y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x4y83abcEv
  ~FF1x4y8(); // tgen
  FF1x4y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y83efgEv");}
void  ccc::FF1x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x4y83abcEv");}
ccc::FF1x4y8 ::~FF1x4y8(){ note_dtor("_ZN3ccc7FF1x4y8E", this);} // tgen
ccc::FF1x4y8 ::FF1x4y8(){ note_ctor("_ZN3ccc7FF1x4y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y8E, buf);
    ::ccc::FF1x4y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y8E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y8E);
    dp->::ccc::FF1x4y8::~FF1x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y8E(Test__ZN3ccc7FF1x4y8E, "_ZN3ccc7FF1x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y8C1Ev();
extern void _ZN3ccc7FF1x4y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y8E[] = {
  NSPAIR(_ZN3ccc7FF1x4y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y8E[];
extern void _ZN3ccc7FF1x4y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x4y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y8E[] = {
  {&(_ZTVN3ccc7FF1x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y8E[];
static VTBL_ENTRY alt_thunk_names313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y8E = {  "_ZN3ccc7FF1x4y8E", // class name
  bases__ZN3ccc7FF1x4y8E, 2,
  &(vtc__ZN3ccc7FF1x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names313,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y9  : virtual ::ccc::EE1x4 {
  virtual void  efg(); // _ZN3ccc7FF1x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x4y93pqrEv
  ~FF1x4y9(); // tgen
  FF1x4y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x4y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x4y93efgEv");}
void  ccc::FF1x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x4y93pqrEv");}
ccc::FF1x4y9 ::~FF1x4y9(){ note_dtor("_ZN3ccc7FF1x4y9E", this);} // tgen
ccc::FF1x4y9 ::FF1x4y9(){ note_ctor("_ZN3ccc7FF1x4y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x4y9E, buf);
    ::ccc::FF1x4y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x4y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y9E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc7FF1x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x4y9E);
    dp->::ccc::FF1x4y9::~FF1x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x4y9E(Test__ZN3ccc7FF1x4y9E, "_ZN3ccc7FF1x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x4y9C1Ev();
extern void _ZN3ccc7FF1x4y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x4y9E[] = {
  NSPAIR(_ZN3ccc7FF1x4y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc7FF1x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x4y93pqrEv();
extern void _ZN3ccc7FF1x4y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x4y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x4y9E[] = {
  {&(_ZTVN3ccc7FF1x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x4y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_7FF1x4y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x4y9E[];
static VTBL_ENTRY alt_thunk_names314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x4y9E = {  "_ZN3ccc7FF1x4y9E", // class name
  bases__ZN3ccc7FF1x4y9E, 2,
  &(vtc__ZN3ccc7FF1x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x4y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x4y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x4y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x4y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names314,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y10  : virtual ::ccc::EE1x4 {
  virtual void  pqr(); // _ZN3ccc8FF1x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x4y103abcEv
  ~FF1x4y10(); // tgen
  FF1x4y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x4y103pqrEv");}
void  ccc::FF1x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x4y103abcEv");}
ccc::FF1x4y10 ::~FF1x4y10(){ note_dtor("_ZN3ccc8FF1x4y10E", this);} // tgen
ccc::FF1x4y10 ::FF1x4y10(){ note_ctor("_ZN3ccc8FF1x4y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y10E, buf);
    ::ccc::FF1x4y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y10E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y10E);
    dp->::ccc::FF1x4y10::~FF1x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y10E(Test__ZN3ccc8FF1x4y10E, "_ZN3ccc8FF1x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y10C1Ev();
extern void _ZN3ccc8FF1x4y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y10E[] = {
  NSPAIR(_ZN3ccc8FF1x4y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y10E[];
extern void _ZN3ccc8FF1x4y103abcEv();
extern void _ZN3ccc8FF1x4y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y10E[] = {
  {&(_ZTVN3ccc8FF1x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y10E[];
static VTBL_ENTRY alt_thunk_names315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y10E = {  "_ZN3ccc8FF1x4y10E", // class name
  bases__ZN3ccc8FF1x4y10E, 2,
  &(vtc__ZN3ccc8FF1x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names315,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y11  : virtual ::ccc::EE1x4 {
  virtual void  pqr(); // _ZN3ccc8FF1x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x4y113efgEv
  ~FF1x4y11(); // tgen
  FF1x4y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x4y113pqrEv");}
void  ccc::FF1x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x4y113efgEv");}
ccc::FF1x4y11 ::~FF1x4y11(){ note_dtor("_ZN3ccc8FF1x4y11E", this);} // tgen
ccc::FF1x4y11 ::FF1x4y11(){ note_ctor("_ZN3ccc8FF1x4y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y11E, buf);
    ::ccc::FF1x4y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y11E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y11E);
    dp->::ccc::FF1x4y11::~FF1x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y11E(Test__ZN3ccc8FF1x4y11E, "_ZN3ccc8FF1x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y11C1Ev();
extern void _ZN3ccc8FF1x4y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y11E[] = {
  NSPAIR(_ZN3ccc8FF1x4y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x4y113pqrEv();
extern void _ZN3ccc8FF1x4y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y11E[] = {
  {&(_ZTVN3ccc8FF1x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y11E[];
static VTBL_ENTRY alt_thunk_names316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y11E = {  "_ZN3ccc8FF1x4y11E", // class name
  bases__ZN3ccc8FF1x4y11E, 2,
  &(vtc__ZN3ccc8FF1x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names316,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y12  : virtual ::ccc::EE1x4 {
  virtual void  abc(); // _ZN3ccc8FF1x4y123abcEv
  ~FF1x4y12(); // tgen
  FF1x4y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x4y123abcEv");}
ccc::FF1x4y12 ::~FF1x4y12(){ note_dtor("_ZN3ccc8FF1x4y12E", this);} // tgen
ccc::FF1x4y12 ::FF1x4y12(){ note_ctor("_ZN3ccc8FF1x4y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y12E, buf);
    ::ccc::FF1x4y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y12E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y12E);
    dp->::ccc::FF1x4y12::~FF1x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y12E(Test__ZN3ccc8FF1x4y12E, "_ZN3ccc8FF1x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y12C1Ev();
extern void _ZN3ccc8FF1x4y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y12E[] = {
  NSPAIR(_ZN3ccc8FF1x4y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y12E[];
extern void _ZN3ccc8FF1x4y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y12E[] = {
  {&(_ZTVN3ccc8FF1x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y12E[];
static VTBL_ENTRY alt_thunk_names317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y12E = {  "_ZN3ccc8FF1x4y12E", // class name
  bases__ZN3ccc8FF1x4y12E, 2,
  &(vtc__ZN3ccc8FF1x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names317,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y13  : virtual ::ccc::EE1x4 {
  virtual void  efg(); // _ZN3ccc8FF1x4y133efgEv
  ~FF1x4y13(); // tgen
  FF1x4y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x4y133efgEv");}
ccc::FF1x4y13 ::~FF1x4y13(){ note_dtor("_ZN3ccc8FF1x4y13E", this);} // tgen
ccc::FF1x4y13 ::FF1x4y13(){ note_ctor("_ZN3ccc8FF1x4y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y13E, buf);
    ::ccc::FF1x4y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y13E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y13E);
    dp->::ccc::FF1x4y13::~FF1x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y13E(Test__ZN3ccc8FF1x4y13E, "_ZN3ccc8FF1x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y13C1Ev();
extern void _ZN3ccc8FF1x4y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y13E[] = {
  NSPAIR(_ZN3ccc8FF1x4y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x4y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y13E[] = {
  {&(_ZTVN3ccc8FF1x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y13E[];
static VTBL_ENTRY alt_thunk_names318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y13E = {  "_ZN3ccc8FF1x4y13E", // class name
  bases__ZN3ccc8FF1x4y13E, 2,
  &(vtc__ZN3ccc8FF1x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names318,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y14  : virtual ::ccc::EE1x4 {
  virtual void  pqr(); // _ZN3ccc8FF1x4y143pqrEv
  ~FF1x4y14(); // tgen
  FF1x4y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x4y143pqrEv");}
ccc::FF1x4y14 ::~FF1x4y14(){ note_dtor("_ZN3ccc8FF1x4y14E", this);} // tgen
ccc::FF1x4y14 ::FF1x4y14(){ note_ctor("_ZN3ccc8FF1x4y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y14E, buf);
    ::ccc::FF1x4y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y14E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y14E);
    dp->::ccc::FF1x4y14::~FF1x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y14E(Test__ZN3ccc8FF1x4y14E, "_ZN3ccc8FF1x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y14C1Ev();
extern void _ZN3ccc8FF1x4y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y14E[] = {
  NSPAIR(_ZN3ccc8FF1x4y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x4y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x4y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y14E[] = {
  {&(_ZTVN3ccc8FF1x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y14E[];
static VTBL_ENTRY alt_thunk_names319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y14E = {  "_ZN3ccc8FF1x4y14E", // class name
  bases__ZN3ccc8FF1x4y14E, 2,
  &(vtc__ZN3ccc8FF1x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names319,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x4y15  : virtual ::ccc::EE1x4 {
  ~FF1x4y15(); // tgen
  FF1x4y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x4y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x4y15 ::~FF1x4y15(){ note_dtor("_ZN3ccc8FF1x4y15E", this);} // tgen
ccc::FF1x4y15 ::FF1x4y15(){ note_ctor("_ZN3ccc8FF1x4y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x4y15E, buf);
    ::ccc::FF1x4y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x4y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y15E");
    check_base_class_offset(lv, (::ccc::EE1x4*), 0, "_ZN3ccc8FF1x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x4y15E);
    dp->::ccc::FF1x4y15::~FF1x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x4y15E(Test__ZN3ccc8FF1x4y15E, "_ZN3ccc8FF1x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x4y15C1Ev();
extern void _ZN3ccc8FF1x4y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x4y15E[] = {
  NSPAIR(_ZN3ccc8FF1x4y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x4E[];
static Base_Class bases__ZN3ccc8FF1x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x4y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv)();
extern void _ZN3ccc5EE1x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv)();
extern void _ZN3ccc5EE1x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv)();
extern void _ZN3ccc5EE1x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x4y15E[] = {
  {&(_ZTVN3ccc8FF1x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x4y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x4E__NS_8FF1x4y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x4y15E[];
static VTBL_ENTRY alt_thunk_names320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x43efgEv,_ZTv0_n20_N3ccc5EE1x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x43pqrEv,_ZTv0_n16_N3ccc5EE1x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x43abcEv,_ZTv0_n12_N3ccc5EE1x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x4y15E = {  "_ZN3ccc8FF1x4y15E", // class name
  bases__ZN3ccc8FF1x4y15E, 2,
  &(vtc__ZN3ccc8FF1x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x4y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x4y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x4y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x4y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names320,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y0  : virtual ::ccc::EE1x5 {
  virtual void  abc(); // _ZN3ccc7FF1x5y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y03pqrEv
  ~FF1x5y0(); // tgen
  FF1x5y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y03abcEv");}
void  ccc::FF1x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y03efgEv");}
void  ccc::FF1x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y03pqrEv");}
ccc::FF1x5y0 ::~FF1x5y0(){ note_dtor("_ZN3ccc7FF1x5y0E", this);} // tgen
ccc::FF1x5y0 ::FF1x5y0(){ note_ctor("_ZN3ccc7FF1x5y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y0E, buf);
    ::ccc::FF1x5y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y0E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y0E);
    dp->::ccc::FF1x5y0::~FF1x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y0E(Test__ZN3ccc7FF1x5y0E, "_ZN3ccc7FF1x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y0C1Ev();
extern void _ZN3ccc7FF1x5y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y0E[] = {
  NSPAIR(_ZN3ccc7FF1x5y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y0E[];
extern void _ZN3ccc7FF1x5y03abcEv();
extern void _ZN3ccc7FF1x5y03pqrEv();
extern void _ZN3ccc7FF1x5y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y0E[] = {
  {&(_ZTVN3ccc7FF1x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y0E[];
static VTBL_ENTRY alt_thunk_names321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y0E = {  "_ZN3ccc7FF1x5y0E", // class name
  bases__ZN3ccc7FF1x5y0E, 2,
  &(vtc__ZN3ccc7FF1x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y0E),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
namespace ccc { 
struct  FF1x5y1  : virtual ::ccc::EE1x5 {
  virtual void  abc(); // _ZN3ccc7FF1x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x5y13efgEv
  ~FF1x5y1(); // tgen
  FF1x5y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y13abcEv");}
void  ccc::FF1x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y13pqrEv");}
void  ccc::FF1x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y13efgEv");}
ccc::FF1x5y1 ::~FF1x5y1(){ note_dtor("_ZN3ccc7FF1x5y1E", this);} // tgen
ccc::FF1x5y1 ::FF1x5y1(){ note_ctor("_ZN3ccc7FF1x5y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y1E, buf);
    ::ccc::FF1x5y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y1E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y1E);
    dp->::ccc::FF1x5y1::~FF1x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y1E(Test__ZN3ccc7FF1x5y1E, "_ZN3ccc7FF1x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y1C1Ev();
extern void _ZN3ccc7FF1x5y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y1E[] = {
  NSPAIR(_ZN3ccc7FF1x5y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y1E[];
extern void _ZN3ccc7FF1x5y13abcEv();
extern void _ZN3ccc7FF1x5y13pqrEv();
extern void _ZN3ccc7FF1x5y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y1E[] = {
  {&(_ZTVN3ccc7FF1x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y1E[];
static VTBL_ENTRY alt_thunk_names322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y1E = {  "_ZN3ccc7FF1x5y1E", // class name
  bases__ZN3ccc7FF1x5y1E, 2,
  &(vtc__ZN3ccc7FF1x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names322,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y2  : virtual ::ccc::EE1x5 {
  virtual void  efg(); // _ZN3ccc7FF1x5y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y23pqrEv
  ~FF1x5y2(); // tgen
  FF1x5y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y23efgEv");}
void  ccc::FF1x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y23abcEv");}
void  ccc::FF1x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y23pqrEv");}
ccc::FF1x5y2 ::~FF1x5y2(){ note_dtor("_ZN3ccc7FF1x5y2E", this);} // tgen
ccc::FF1x5y2 ::FF1x5y2(){ note_ctor("_ZN3ccc7FF1x5y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y2E, buf);
    ::ccc::FF1x5y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y2E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y2E);
    dp->::ccc::FF1x5y2::~FF1x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y2E(Test__ZN3ccc7FF1x5y2E, "_ZN3ccc7FF1x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y2C1Ev();
extern void _ZN3ccc7FF1x5y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y2E[] = {
  NSPAIR(_ZN3ccc7FF1x5y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y2E[];
extern void _ZN3ccc7FF1x5y23abcEv();
extern void _ZN3ccc7FF1x5y23pqrEv();
extern void _ZN3ccc7FF1x5y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y2E[] = {
  {&(_ZTVN3ccc7FF1x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y2E[];
static VTBL_ENTRY alt_thunk_names323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y2E = {  "_ZN3ccc7FF1x5y2E", // class name
  bases__ZN3ccc7FF1x5y2E, 2,
  &(vtc__ZN3ccc7FF1x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names323,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y3  : virtual ::ccc::EE1x5 {
  virtual void  efg(); // _ZN3ccc7FF1x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x5y33abcEv
  ~FF1x5y3(); // tgen
  FF1x5y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y33efgEv");}
void  ccc::FF1x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y33pqrEv");}
void  ccc::FF1x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y33abcEv");}
ccc::FF1x5y3 ::~FF1x5y3(){ note_dtor("_ZN3ccc7FF1x5y3E", this);} // tgen
ccc::FF1x5y3 ::FF1x5y3(){ note_ctor("_ZN3ccc7FF1x5y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y3E, buf);
    ::ccc::FF1x5y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y3E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y3E);
    dp->::ccc::FF1x5y3::~FF1x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y3E(Test__ZN3ccc7FF1x5y3E, "_ZN3ccc7FF1x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y3C1Ev();
extern void _ZN3ccc7FF1x5y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y3E[] = {
  NSPAIR(_ZN3ccc7FF1x5y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y3E[];
extern void _ZN3ccc7FF1x5y33abcEv();
extern void _ZN3ccc7FF1x5y33pqrEv();
extern void _ZN3ccc7FF1x5y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y3E[] = {
  {&(_ZTVN3ccc7FF1x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y3E[];
static VTBL_ENTRY alt_thunk_names324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y3E = {  "_ZN3ccc7FF1x5y3E", // class name
  bases__ZN3ccc7FF1x5y3E, 2,
  &(vtc__ZN3ccc7FF1x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names324,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y4  : virtual ::ccc::EE1x5 {
  virtual void  pqr(); // _ZN3ccc7FF1x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x5y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x5y43efgEv
  ~FF1x5y4(); // tgen
  FF1x5y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y43pqrEv");}
void  ccc::FF1x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y43abcEv");}
void  ccc::FF1x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y43efgEv");}
ccc::FF1x5y4 ::~FF1x5y4(){ note_dtor("_ZN3ccc7FF1x5y4E", this);} // tgen
ccc::FF1x5y4 ::FF1x5y4(){ note_ctor("_ZN3ccc7FF1x5y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y4E, buf);
    ::ccc::FF1x5y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y4E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y4E);
    dp->::ccc::FF1x5y4::~FF1x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y4E(Test__ZN3ccc7FF1x5y4E, "_ZN3ccc7FF1x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y4C1Ev();
extern void _ZN3ccc7FF1x5y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y4E[] = {
  NSPAIR(_ZN3ccc7FF1x5y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y4E[];
extern void _ZN3ccc7FF1x5y43abcEv();
extern void _ZN3ccc7FF1x5y43pqrEv();
extern void _ZN3ccc7FF1x5y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y4E[] = {
  {&(_ZTVN3ccc7FF1x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y4E[];
static VTBL_ENTRY alt_thunk_names325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y4E = {  "_ZN3ccc7FF1x5y4E", // class name
  bases__ZN3ccc7FF1x5y4E, 2,
  &(vtc__ZN3ccc7FF1x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names325,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y5  : virtual ::ccc::EE1x5 {
  virtual void  pqr(); // _ZN3ccc7FF1x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x5y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x5y53abcEv
  ~FF1x5y5(); // tgen
  FF1x5y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y53pqrEv");}
void  ccc::FF1x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y53efgEv");}
void  ccc::FF1x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y53abcEv");}
ccc::FF1x5y5 ::~FF1x5y5(){ note_dtor("_ZN3ccc7FF1x5y5E", this);} // tgen
ccc::FF1x5y5 ::FF1x5y5(){ note_ctor("_ZN3ccc7FF1x5y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y5E, buf);
    ::ccc::FF1x5y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y5E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y5E);
    dp->::ccc::FF1x5y5::~FF1x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y5E(Test__ZN3ccc7FF1x5y5E, "_ZN3ccc7FF1x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y5C1Ev();
extern void _ZN3ccc7FF1x5y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y5E[] = {
  NSPAIR(_ZN3ccc7FF1x5y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y5E[];
extern void _ZN3ccc7FF1x5y53abcEv();
extern void _ZN3ccc7FF1x5y53pqrEv();
extern void _ZN3ccc7FF1x5y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y5E[] = {
  {&(_ZTVN3ccc7FF1x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y5E[];
static VTBL_ENTRY alt_thunk_names326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y5E = {  "_ZN3ccc7FF1x5y5E", // class name
  bases__ZN3ccc7FF1x5y5E, 2,
  &(vtc__ZN3ccc7FF1x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names326,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y6  : virtual ::ccc::EE1x5 {
  virtual void  abc(); // _ZN3ccc7FF1x5y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x5y63efgEv
  ~FF1x5y6(); // tgen
  FF1x5y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y63abcEv");}
void  ccc::FF1x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y63efgEv");}
ccc::FF1x5y6 ::~FF1x5y6(){ note_dtor("_ZN3ccc7FF1x5y6E", this);} // tgen
ccc::FF1x5y6 ::FF1x5y6(){ note_ctor("_ZN3ccc7FF1x5y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y6E, buf);
    ::ccc::FF1x5y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y6E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y6E);
    dp->::ccc::FF1x5y6::~FF1x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y6E(Test__ZN3ccc7FF1x5y6E, "_ZN3ccc7FF1x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y6C1Ev();
extern void _ZN3ccc7FF1x5y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y6E[] = {
  NSPAIR(_ZN3ccc7FF1x5y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y6E[];
extern void _ZN3ccc7FF1x5y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x5y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y6E[] = {
  {&(_ZTVN3ccc7FF1x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y6E[];
static VTBL_ENTRY alt_thunk_names327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y6E = {  "_ZN3ccc7FF1x5y6E", // class name
  bases__ZN3ccc7FF1x5y6E, 2,
  &(vtc__ZN3ccc7FF1x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names327,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y7  : virtual ::ccc::EE1x5 {
  virtual void  abc(); // _ZN3ccc7FF1x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y73pqrEv
  ~FF1x5y7(); // tgen
  FF1x5y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y73abcEv");}
void  ccc::FF1x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y73pqrEv");}
ccc::FF1x5y7 ::~FF1x5y7(){ note_dtor("_ZN3ccc7FF1x5y7E", this);} // tgen
ccc::FF1x5y7 ::FF1x5y7(){ note_ctor("_ZN3ccc7FF1x5y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y7E, buf);
    ::ccc::FF1x5y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y7E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y7E);
    dp->::ccc::FF1x5y7::~FF1x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y7E(Test__ZN3ccc7FF1x5y7E, "_ZN3ccc7FF1x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y7C1Ev();
extern void _ZN3ccc7FF1x5y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y7E[] = {
  NSPAIR(_ZN3ccc7FF1x5y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y7E[];
extern void _ZN3ccc7FF1x5y73abcEv();
extern void _ZN3ccc7FF1x5y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y7E[] = {
  {&(_ZTVN3ccc7FF1x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y7E[];
static VTBL_ENTRY alt_thunk_names328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y7E = {  "_ZN3ccc7FF1x5y7E", // class name
  bases__ZN3ccc7FF1x5y7E, 2,
  &(vtc__ZN3ccc7FF1x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names328,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y8  : virtual ::ccc::EE1x5 {
  virtual void  efg(); // _ZN3ccc7FF1x5y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x5y83abcEv
  ~FF1x5y8(); // tgen
  FF1x5y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y83efgEv");}
void  ccc::FF1x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x5y83abcEv");}
ccc::FF1x5y8 ::~FF1x5y8(){ note_dtor("_ZN3ccc7FF1x5y8E", this);} // tgen
ccc::FF1x5y8 ::FF1x5y8(){ note_ctor("_ZN3ccc7FF1x5y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y8E, buf);
    ::ccc::FF1x5y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y8E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y8E);
    dp->::ccc::FF1x5y8::~FF1x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y8E(Test__ZN3ccc7FF1x5y8E, "_ZN3ccc7FF1x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y8C1Ev();
extern void _ZN3ccc7FF1x5y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y8E[] = {
  NSPAIR(_ZN3ccc7FF1x5y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y8E[];
extern void _ZN3ccc7FF1x5y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x5y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y8E[] = {
  {&(_ZTVN3ccc7FF1x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y8E[];
static VTBL_ENTRY alt_thunk_names329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y8E = {  "_ZN3ccc7FF1x5y8E", // class name
  bases__ZN3ccc7FF1x5y8E, 2,
  &(vtc__ZN3ccc7FF1x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names329,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y9  : virtual ::ccc::EE1x5 {
  virtual void  efg(); // _ZN3ccc7FF1x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x5y93pqrEv
  ~FF1x5y9(); // tgen
  FF1x5y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x5y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x5y93efgEv");}
void  ccc::FF1x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x5y93pqrEv");}
ccc::FF1x5y9 ::~FF1x5y9(){ note_dtor("_ZN3ccc7FF1x5y9E", this);} // tgen
ccc::FF1x5y9 ::FF1x5y9(){ note_ctor("_ZN3ccc7FF1x5y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x5y9E, buf);
    ::ccc::FF1x5y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x5y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y9E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc7FF1x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x5y9E);
    dp->::ccc::FF1x5y9::~FF1x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x5y9E(Test__ZN3ccc7FF1x5y9E, "_ZN3ccc7FF1x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x5y9C1Ev();
extern void _ZN3ccc7FF1x5y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x5y9E[] = {
  NSPAIR(_ZN3ccc7FF1x5y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc7FF1x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x5y93pqrEv();
extern void _ZN3ccc7FF1x5y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x5y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x5y9E[] = {
  {&(_ZTVN3ccc7FF1x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x5y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_7FF1x5y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x5y9E[];
static VTBL_ENTRY alt_thunk_names330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x5y9E = {  "_ZN3ccc7FF1x5y9E", // class name
  bases__ZN3ccc7FF1x5y9E, 2,
  &(vtc__ZN3ccc7FF1x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x5y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x5y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x5y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x5y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names330,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y10  : virtual ::ccc::EE1x5 {
  virtual void  pqr(); // _ZN3ccc8FF1x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x5y103abcEv
  ~FF1x5y10(); // tgen
  FF1x5y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x5y103pqrEv");}
void  ccc::FF1x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x5y103abcEv");}
ccc::FF1x5y10 ::~FF1x5y10(){ note_dtor("_ZN3ccc8FF1x5y10E", this);} // tgen
ccc::FF1x5y10 ::FF1x5y10(){ note_ctor("_ZN3ccc8FF1x5y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y10E, buf);
    ::ccc::FF1x5y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y10E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y10E);
    dp->::ccc::FF1x5y10::~FF1x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y10E(Test__ZN3ccc8FF1x5y10E, "_ZN3ccc8FF1x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y10C1Ev();
extern void _ZN3ccc8FF1x5y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y10E[] = {
  NSPAIR(_ZN3ccc8FF1x5y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y10E[];
extern void _ZN3ccc8FF1x5y103abcEv();
extern void _ZN3ccc8FF1x5y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y10E[] = {
  {&(_ZTVN3ccc8FF1x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y10E[];
static VTBL_ENTRY alt_thunk_names331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y10E = {  "_ZN3ccc8FF1x5y10E", // class name
  bases__ZN3ccc8FF1x5y10E, 2,
  &(vtc__ZN3ccc8FF1x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names331,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y11  : virtual ::ccc::EE1x5 {
  virtual void  pqr(); // _ZN3ccc8FF1x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x5y113efgEv
  ~FF1x5y11(); // tgen
  FF1x5y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x5y113pqrEv");}
void  ccc::FF1x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x5y113efgEv");}
ccc::FF1x5y11 ::~FF1x5y11(){ note_dtor("_ZN3ccc8FF1x5y11E", this);} // tgen
ccc::FF1x5y11 ::FF1x5y11(){ note_ctor("_ZN3ccc8FF1x5y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y11E, buf);
    ::ccc::FF1x5y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y11E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y11E);
    dp->::ccc::FF1x5y11::~FF1x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y11E(Test__ZN3ccc8FF1x5y11E, "_ZN3ccc8FF1x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y11C1Ev();
extern void _ZN3ccc8FF1x5y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y11E[] = {
  NSPAIR(_ZN3ccc8FF1x5y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x5y113pqrEv();
extern void _ZN3ccc8FF1x5y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y11E[] = {
  {&(_ZTVN3ccc8FF1x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y11E[];
static VTBL_ENTRY alt_thunk_names332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y11E = {  "_ZN3ccc8FF1x5y11E", // class name
  bases__ZN3ccc8FF1x5y11E, 2,
  &(vtc__ZN3ccc8FF1x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names332,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y12  : virtual ::ccc::EE1x5 {
  virtual void  abc(); // _ZN3ccc8FF1x5y123abcEv
  ~FF1x5y12(); // tgen
  FF1x5y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF1x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x5y123abcEv");}
ccc::FF1x5y12 ::~FF1x5y12(){ note_dtor("_ZN3ccc8FF1x5y12E", this);} // tgen
ccc::FF1x5y12 ::FF1x5y12(){ note_ctor("_ZN3ccc8FF1x5y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y12E, buf);
    ::ccc::FF1x5y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y12E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y12E);
    dp->::ccc::FF1x5y12::~FF1x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y12E(Test__ZN3ccc8FF1x5y12E, "_ZN3ccc8FF1x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y12C1Ev();
extern void _ZN3ccc8FF1x5y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y12E[] = {
  NSPAIR(_ZN3ccc8FF1x5y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y12E[];
extern void _ZN3ccc8FF1x5y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y12E[] = {
  {&(_ZTVN3ccc8FF1x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y12E[];
static VTBL_ENTRY alt_thunk_names333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y12E = {  "_ZN3ccc8FF1x5y12E", // class name
  bases__ZN3ccc8FF1x5y12E, 2,
  &(vtc__ZN3ccc8FF1x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names333,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y13  : virtual ::ccc::EE1x5 {
  virtual void  efg(); // _ZN3ccc8FF1x5y133efgEv
  ~FF1x5y13(); // tgen
  FF1x5y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF1x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x5y133efgEv");}
ccc::FF1x5y13 ::~FF1x5y13(){ note_dtor("_ZN3ccc8FF1x5y13E", this);} // tgen
ccc::FF1x5y13 ::FF1x5y13(){ note_ctor("_ZN3ccc8FF1x5y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y13E, buf);
    ::ccc::FF1x5y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y13E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y13E);
    dp->::ccc::FF1x5y13::~FF1x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y13E(Test__ZN3ccc8FF1x5y13E, "_ZN3ccc8FF1x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y13C1Ev();
extern void _ZN3ccc8FF1x5y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y13E[] = {
  NSPAIR(_ZN3ccc8FF1x5y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x5y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y13E[] = {
  {&(_ZTVN3ccc8FF1x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y13E[];
static VTBL_ENTRY alt_thunk_names334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y13E = {  "_ZN3ccc8FF1x5y13E", // class name
  bases__ZN3ccc8FF1x5y13E, 2,
  &(vtc__ZN3ccc8FF1x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names334,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y14  : virtual ::ccc::EE1x5 {
  virtual void  pqr(); // _ZN3ccc8FF1x5y143pqrEv
  ~FF1x5y14(); // tgen
  FF1x5y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x5y143pqrEv");}
ccc::FF1x5y14 ::~FF1x5y14(){ note_dtor("_ZN3ccc8FF1x5y14E", this);} // tgen
ccc::FF1x5y14 ::FF1x5y14(){ note_ctor("_ZN3ccc8FF1x5y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y14E, buf);
    ::ccc::FF1x5y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y14E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y14E);
    dp->::ccc::FF1x5y14::~FF1x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y14E(Test__ZN3ccc8FF1x5y14E, "_ZN3ccc8FF1x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y14C1Ev();
extern void _ZN3ccc8FF1x5y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y14E[] = {
  NSPAIR(_ZN3ccc8FF1x5y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x5y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x5y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y14E[] = {
  {&(_ZTVN3ccc8FF1x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y14E[];
static VTBL_ENTRY alt_thunk_names335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y14E = {  "_ZN3ccc8FF1x5y14E", // class name
  bases__ZN3ccc8FF1x5y14E, 2,
  &(vtc__ZN3ccc8FF1x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names335,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x5y15  : virtual ::ccc::EE1x5 {
  ~FF1x5y15(); // tgen
  FF1x5y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x5y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF1x5y15 ::~FF1x5y15(){ note_dtor("_ZN3ccc8FF1x5y15E", this);} // tgen
ccc::FF1x5y15 ::FF1x5y15(){ note_ctor("_ZN3ccc8FF1x5y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x5y15E, buf);
    ::ccc::FF1x5y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x5y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y15E");
    check_base_class_offset(lv, (::ccc::EE1x5*), 0, "_ZN3ccc8FF1x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x5y15E);
    dp->::ccc::FF1x5y15::~FF1x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x5y15E(Test__ZN3ccc8FF1x5y15E, "_ZN3ccc8FF1x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x5y15C1Ev();
extern void _ZN3ccc8FF1x5y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x5y15E[] = {
  NSPAIR(_ZN3ccc8FF1x5y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x5E[];
static Base_Class bases__ZN3ccc8FF1x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x5y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv)();
extern void _ZN3ccc5EE1x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv)();
extern void _ZN3ccc5EE1x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv)();
extern void _ZN3ccc5EE1x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x5y15E[] = {
  {&(_ZTVN3ccc8FF1x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x5y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x5E__NS_8FF1x5y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x5y15E[];
static VTBL_ENTRY alt_thunk_names336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x53efgEv,_ZTv0_n20_N3ccc5EE1x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x53pqrEv,_ZTv0_n16_N3ccc5EE1x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x53abcEv,_ZTv0_n12_N3ccc5EE1x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x5y15E = {  "_ZN3ccc8FF1x5y15E", // class name
  bases__ZN3ccc8FF1x5y15E, 2,
  &(vtc__ZN3ccc8FF1x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x5y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x5y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x5y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x5y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names336,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y0  : virtual ::ccc::EE1x6 {
  virtual void  abc(); // _ZN3ccc7FF1x6y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y03pqrEv
  ~FF1x6y0(); // tgen
  FF1x6y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y03abcEv");}
void  ccc::FF1x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y03efgEv");}
void  ccc::FF1x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y03pqrEv");}
ccc::FF1x6y0 ::~FF1x6y0(){ note_dtor("_ZN3ccc7FF1x6y0E", this);} // tgen
ccc::FF1x6y0 ::FF1x6y0(){ note_ctor("_ZN3ccc7FF1x6y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y0E, buf);
    ::ccc::FF1x6y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y0E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y0E);
    dp->::ccc::FF1x6y0::~FF1x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y0E(Test__ZN3ccc7FF1x6y0E, "_ZN3ccc7FF1x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y0C1Ev();
extern void _ZN3ccc7FF1x6y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y0E[] = {
  NSPAIR(_ZN3ccc7FF1x6y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y0E[];
extern void _ZN3ccc7FF1x6y03abcEv();
extern void _ZN3ccc7FF1x6y03pqrEv();
extern void _ZN3ccc7FF1x6y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y0E[] = {
  {&(_ZTVN3ccc7FF1x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y0E[];
static VTBL_ENTRY alt_thunk_names337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y0E = {  "_ZN3ccc7FF1x6y0E", // class name
  bases__ZN3ccc7FF1x6y0E, 2,
  &(vtc__ZN3ccc7FF1x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names337,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y1  : virtual ::ccc::EE1x6 {
  virtual void  abc(); // _ZN3ccc7FF1x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x6y13efgEv
  ~FF1x6y1(); // tgen
  FF1x6y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y13abcEv");}
void  ccc::FF1x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y13pqrEv");}
void  ccc::FF1x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y13efgEv");}
ccc::FF1x6y1 ::~FF1x6y1(){ note_dtor("_ZN3ccc7FF1x6y1E", this);} // tgen
ccc::FF1x6y1 ::FF1x6y1(){ note_ctor("_ZN3ccc7FF1x6y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y1E, buf);
    ::ccc::FF1x6y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y1E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y1E);
    dp->::ccc::FF1x6y1::~FF1x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y1E(Test__ZN3ccc7FF1x6y1E, "_ZN3ccc7FF1x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y1C1Ev();
extern void _ZN3ccc7FF1x6y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y1E[] = {
  NSPAIR(_ZN3ccc7FF1x6y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y1E[];
extern void _ZN3ccc7FF1x6y13abcEv();
extern void _ZN3ccc7FF1x6y13pqrEv();
extern void _ZN3ccc7FF1x6y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y1E[] = {
  {&(_ZTVN3ccc7FF1x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y1E[];
static VTBL_ENTRY alt_thunk_names338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y1E = {  "_ZN3ccc7FF1x6y1E", // class name
  bases__ZN3ccc7FF1x6y1E, 2,
  &(vtc__ZN3ccc7FF1x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names338,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y2  : virtual ::ccc::EE1x6 {
  virtual void  efg(); // _ZN3ccc7FF1x6y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y23pqrEv
  ~FF1x6y2(); // tgen
  FF1x6y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y23efgEv");}
void  ccc::FF1x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y23abcEv");}
void  ccc::FF1x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y23pqrEv");}
ccc::FF1x6y2 ::~FF1x6y2(){ note_dtor("_ZN3ccc7FF1x6y2E", this);} // tgen
ccc::FF1x6y2 ::FF1x6y2(){ note_ctor("_ZN3ccc7FF1x6y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y2E, buf);
    ::ccc::FF1x6y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y2E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y2E);
    dp->::ccc::FF1x6y2::~FF1x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y2E(Test__ZN3ccc7FF1x6y2E, "_ZN3ccc7FF1x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y2C1Ev();
extern void _ZN3ccc7FF1x6y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y2E[] = {
  NSPAIR(_ZN3ccc7FF1x6y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y2E[];
extern void _ZN3ccc7FF1x6y23abcEv();
extern void _ZN3ccc7FF1x6y23pqrEv();
extern void _ZN3ccc7FF1x6y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y2E[] = {
  {&(_ZTVN3ccc7FF1x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y2E[];
static VTBL_ENTRY alt_thunk_names339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y2E = {  "_ZN3ccc7FF1x6y2E", // class name
  bases__ZN3ccc7FF1x6y2E, 2,
  &(vtc__ZN3ccc7FF1x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y2E),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
namespace ccc { 
struct  FF1x6y3  : virtual ::ccc::EE1x6 {
  virtual void  efg(); // _ZN3ccc7FF1x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x6y33abcEv
  ~FF1x6y3(); // tgen
  FF1x6y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y33efgEv");}
void  ccc::FF1x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y33pqrEv");}
void  ccc::FF1x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y33abcEv");}
ccc::FF1x6y3 ::~FF1x6y3(){ note_dtor("_ZN3ccc7FF1x6y3E", this);} // tgen
ccc::FF1x6y3 ::FF1x6y3(){ note_ctor("_ZN3ccc7FF1x6y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y3E, buf);
    ::ccc::FF1x6y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y3E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y3E);
    dp->::ccc::FF1x6y3::~FF1x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y3E(Test__ZN3ccc7FF1x6y3E, "_ZN3ccc7FF1x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y3C1Ev();
extern void _ZN3ccc7FF1x6y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y3E[] = {
  NSPAIR(_ZN3ccc7FF1x6y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y3E[];
extern void _ZN3ccc7FF1x6y33abcEv();
extern void _ZN3ccc7FF1x6y33pqrEv();
extern void _ZN3ccc7FF1x6y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y3E[] = {
  {&(_ZTVN3ccc7FF1x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y3E[];
static VTBL_ENTRY alt_thunk_names340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y3E = {  "_ZN3ccc7FF1x6y3E", // class name
  bases__ZN3ccc7FF1x6y3E, 2,
  &(vtc__ZN3ccc7FF1x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names340,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y4  : virtual ::ccc::EE1x6 {
  virtual void  pqr(); // _ZN3ccc7FF1x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x6y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x6y43efgEv
  ~FF1x6y4(); // tgen
  FF1x6y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y43pqrEv");}
void  ccc::FF1x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y43abcEv");}
void  ccc::FF1x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y43efgEv");}
ccc::FF1x6y4 ::~FF1x6y4(){ note_dtor("_ZN3ccc7FF1x6y4E", this);} // tgen
ccc::FF1x6y4 ::FF1x6y4(){ note_ctor("_ZN3ccc7FF1x6y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y4E, buf);
    ::ccc::FF1x6y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y4E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y4E);
    dp->::ccc::FF1x6y4::~FF1x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y4E(Test__ZN3ccc7FF1x6y4E, "_ZN3ccc7FF1x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y4C1Ev();
extern void _ZN3ccc7FF1x6y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y4E[] = {
  NSPAIR(_ZN3ccc7FF1x6y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y4E[];
extern void _ZN3ccc7FF1x6y43abcEv();
extern void _ZN3ccc7FF1x6y43pqrEv();
extern void _ZN3ccc7FF1x6y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y4E[] = {
  {&(_ZTVN3ccc7FF1x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y4E[];
static VTBL_ENTRY alt_thunk_names341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y4E = {  "_ZN3ccc7FF1x6y4E", // class name
  bases__ZN3ccc7FF1x6y4E, 2,
  &(vtc__ZN3ccc7FF1x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names341,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y5  : virtual ::ccc::EE1x6 {
  virtual void  pqr(); // _ZN3ccc7FF1x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x6y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x6y53abcEv
  ~FF1x6y5(); // tgen
  FF1x6y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y53pqrEv");}
void  ccc::FF1x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y53efgEv");}
void  ccc::FF1x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y53abcEv");}
ccc::FF1x6y5 ::~FF1x6y5(){ note_dtor("_ZN3ccc7FF1x6y5E", this);} // tgen
ccc::FF1x6y5 ::FF1x6y5(){ note_ctor("_ZN3ccc7FF1x6y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y5E, buf);
    ::ccc::FF1x6y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y5E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y5E);
    dp->::ccc::FF1x6y5::~FF1x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y5E(Test__ZN3ccc7FF1x6y5E, "_ZN3ccc7FF1x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y5C1Ev();
extern void _ZN3ccc7FF1x6y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y5E[] = {
  NSPAIR(_ZN3ccc7FF1x6y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y5E[];
extern void _ZN3ccc7FF1x6y53abcEv();
extern void _ZN3ccc7FF1x6y53pqrEv();
extern void _ZN3ccc7FF1x6y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y5E[] = {
  {&(_ZTVN3ccc7FF1x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y5E[];
static VTBL_ENTRY alt_thunk_names342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y5E = {  "_ZN3ccc7FF1x6y5E", // class name
  bases__ZN3ccc7FF1x6y5E, 2,
  &(vtc__ZN3ccc7FF1x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names342,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y6  : virtual ::ccc::EE1x6 {
  virtual void  abc(); // _ZN3ccc7FF1x6y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x6y63efgEv
  ~FF1x6y6(); // tgen
  FF1x6y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y63abcEv");}
void  ccc::FF1x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y63efgEv");}
ccc::FF1x6y6 ::~FF1x6y6(){ note_dtor("_ZN3ccc7FF1x6y6E", this);} // tgen
ccc::FF1x6y6 ::FF1x6y6(){ note_ctor("_ZN3ccc7FF1x6y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y6E, buf);
    ::ccc::FF1x6y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y6E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y6E);
    dp->::ccc::FF1x6y6::~FF1x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y6E(Test__ZN3ccc7FF1x6y6E, "_ZN3ccc7FF1x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y6C1Ev();
extern void _ZN3ccc7FF1x6y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y6E[] = {
  NSPAIR(_ZN3ccc7FF1x6y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y6E[];
extern void _ZN3ccc7FF1x6y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7FF1x6y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y6E[] = {
  {&(_ZTVN3ccc7FF1x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y6E[];
static VTBL_ENTRY alt_thunk_names343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y6E = {  "_ZN3ccc7FF1x6y6E", // class name
  bases__ZN3ccc7FF1x6y6E, 2,
  &(vtc__ZN3ccc7FF1x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names343,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y7  : virtual ::ccc::EE1x6 {
  virtual void  abc(); // _ZN3ccc7FF1x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y73pqrEv
  ~FF1x6y7(); // tgen
  FF1x6y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y73abcEv");}
void  ccc::FF1x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y73pqrEv");}
ccc::FF1x6y7 ::~FF1x6y7(){ note_dtor("_ZN3ccc7FF1x6y7E", this);} // tgen
ccc::FF1x6y7 ::FF1x6y7(){ note_ctor("_ZN3ccc7FF1x6y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y7E, buf);
    ::ccc::FF1x6y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y7E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y7E);
    dp->::ccc::FF1x6y7::~FF1x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y7E(Test__ZN3ccc7FF1x6y7E, "_ZN3ccc7FF1x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y7C1Ev();
extern void _ZN3ccc7FF1x6y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y7E[] = {
  NSPAIR(_ZN3ccc7FF1x6y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y7E[];
extern void _ZN3ccc7FF1x6y73abcEv();
extern void _ZN3ccc7FF1x6y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y7E[] = {
  {&(_ZTVN3ccc7FF1x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y7E[];
static VTBL_ENTRY alt_thunk_names344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y7E = {  "_ZN3ccc7FF1x6y7E", // class name
  bases__ZN3ccc7FF1x6y7E, 2,
  &(vtc__ZN3ccc7FF1x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names344,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y8  : virtual ::ccc::EE1x6 {
  virtual void  efg(); // _ZN3ccc7FF1x6y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x6y83abcEv
  ~FF1x6y8(); // tgen
  FF1x6y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y83efgEv");}
void  ccc::FF1x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x6y83abcEv");}
ccc::FF1x6y8 ::~FF1x6y8(){ note_dtor("_ZN3ccc7FF1x6y8E", this);} // tgen
ccc::FF1x6y8 ::FF1x6y8(){ note_ctor("_ZN3ccc7FF1x6y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y8E, buf);
    ::ccc::FF1x6y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y8E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y8E);
    dp->::ccc::FF1x6y8::~FF1x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y8E(Test__ZN3ccc7FF1x6y8E, "_ZN3ccc7FF1x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y8C1Ev();
extern void _ZN3ccc7FF1x6y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y8E[] = {
  NSPAIR(_ZN3ccc7FF1x6y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y8E[];
extern void _ZN3ccc7FF1x6y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7FF1x6y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y8E[] = {
  {&(_ZTVN3ccc7FF1x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y8E[];
static VTBL_ENTRY alt_thunk_names345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y8E = {  "_ZN3ccc7FF1x6y8E", // class name
  bases__ZN3ccc7FF1x6y8E, 2,
  &(vtc__ZN3ccc7FF1x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names345,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y9  : virtual ::ccc::EE1x6 {
  virtual void  efg(); // _ZN3ccc7FF1x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x6y93pqrEv
  ~FF1x6y9(); // tgen
  FF1x6y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x6y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x6y93efgEv");}
void  ccc::FF1x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x6y93pqrEv");}
ccc::FF1x6y9 ::~FF1x6y9(){ note_dtor("_ZN3ccc7FF1x6y9E", this);} // tgen
ccc::FF1x6y9 ::FF1x6y9(){ note_ctor("_ZN3ccc7FF1x6y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x6y9E, buf);
    ::ccc::FF1x6y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x6y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y9E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc7FF1x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x6y9E);
    dp->::ccc::FF1x6y9::~FF1x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x6y9E(Test__ZN3ccc7FF1x6y9E, "_ZN3ccc7FF1x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x6y9C1Ev();
extern void _ZN3ccc7FF1x6y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x6y9E[] = {
  NSPAIR(_ZN3ccc7FF1x6y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc7FF1x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x6y93pqrEv();
extern void _ZN3ccc7FF1x6y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x6y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x6y9E[] = {
  {&(_ZTVN3ccc7FF1x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x6y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_7FF1x6y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x6y9E[];
static VTBL_ENTRY alt_thunk_names346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x6y9E = {  "_ZN3ccc7FF1x6y9E", // class name
  bases__ZN3ccc7FF1x6y9E, 2,
  &(vtc__ZN3ccc7FF1x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x6y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x6y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x6y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x6y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names346,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y10  : virtual ::ccc::EE1x6 {
  virtual void  pqr(); // _ZN3ccc8FF1x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x6y103abcEv
  ~FF1x6y10(); // tgen
  FF1x6y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x6y103pqrEv");}
void  ccc::FF1x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x6y103abcEv");}
ccc::FF1x6y10 ::~FF1x6y10(){ note_dtor("_ZN3ccc8FF1x6y10E", this);} // tgen
ccc::FF1x6y10 ::FF1x6y10(){ note_ctor("_ZN3ccc8FF1x6y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y10E, buf);
    ::ccc::FF1x6y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y10E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y10E);
    dp->::ccc::FF1x6y10::~FF1x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y10E(Test__ZN3ccc8FF1x6y10E, "_ZN3ccc8FF1x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y10C1Ev();
extern void _ZN3ccc8FF1x6y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y10E[] = {
  NSPAIR(_ZN3ccc8FF1x6y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y10E[];
extern void _ZN3ccc8FF1x6y103abcEv();
extern void _ZN3ccc8FF1x6y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y10E[] = {
  {&(_ZTVN3ccc8FF1x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y10E[];
static VTBL_ENTRY alt_thunk_names347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y10E = {  "_ZN3ccc8FF1x6y10E", // class name
  bases__ZN3ccc8FF1x6y10E, 2,
  &(vtc__ZN3ccc8FF1x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names347,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y11  : virtual ::ccc::EE1x6 {
  virtual void  pqr(); // _ZN3ccc8FF1x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x6y113efgEv
  ~FF1x6y11(); // tgen
  FF1x6y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x6y113pqrEv");}
void  ccc::FF1x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x6y113efgEv");}
ccc::FF1x6y11 ::~FF1x6y11(){ note_dtor("_ZN3ccc8FF1x6y11E", this);} // tgen
ccc::FF1x6y11 ::FF1x6y11(){ note_ctor("_ZN3ccc8FF1x6y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y11E, buf);
    ::ccc::FF1x6y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y11E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y11E);
    dp->::ccc::FF1x6y11::~FF1x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y11E(Test__ZN3ccc8FF1x6y11E, "_ZN3ccc8FF1x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y11C1Ev();
extern void _ZN3ccc8FF1x6y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y11E[] = {
  NSPAIR(_ZN3ccc8FF1x6y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x6y113pqrEv();
extern void _ZN3ccc8FF1x6y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y11E[] = {
  {&(_ZTVN3ccc8FF1x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y11E[];
static VTBL_ENTRY alt_thunk_names348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y11E = {  "_ZN3ccc8FF1x6y11E", // class name
  bases__ZN3ccc8FF1x6y11E, 2,
  &(vtc__ZN3ccc8FF1x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names348,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y12  : virtual ::ccc::EE1x6 {
  virtual void  abc(); // _ZN3ccc8FF1x6y123abcEv
  ~FF1x6y12(); // tgen
  FF1x6y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x6y123abcEv");}
ccc::FF1x6y12 ::~FF1x6y12(){ note_dtor("_ZN3ccc8FF1x6y12E", this);} // tgen
ccc::FF1x6y12 ::FF1x6y12(){ note_ctor("_ZN3ccc8FF1x6y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y12E, buf);
    ::ccc::FF1x6y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y12E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y12E);
    dp->::ccc::FF1x6y12::~FF1x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y12E(Test__ZN3ccc8FF1x6y12E, "_ZN3ccc8FF1x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y12C1Ev();
extern void _ZN3ccc8FF1x6y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y12E[] = {
  NSPAIR(_ZN3ccc8FF1x6y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y12E[];
extern void _ZN3ccc8FF1x6y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y12E[] = {
  {&(_ZTVN3ccc8FF1x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y12E[];
static VTBL_ENTRY alt_thunk_names349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y12E = {  "_ZN3ccc8FF1x6y12E", // class name
  bases__ZN3ccc8FF1x6y12E, 2,
  &(vtc__ZN3ccc8FF1x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names349,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y13  : virtual ::ccc::EE1x6 {
  virtual void  efg(); // _ZN3ccc8FF1x6y133efgEv
  ~FF1x6y13(); // tgen
  FF1x6y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x6y133efgEv");}
ccc::FF1x6y13 ::~FF1x6y13(){ note_dtor("_ZN3ccc8FF1x6y13E", this);} // tgen
ccc::FF1x6y13 ::FF1x6y13(){ note_ctor("_ZN3ccc8FF1x6y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y13E, buf);
    ::ccc::FF1x6y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y13E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y13E);
    dp->::ccc::FF1x6y13::~FF1x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y13E(Test__ZN3ccc8FF1x6y13E, "_ZN3ccc8FF1x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y13C1Ev();
extern void _ZN3ccc8FF1x6y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y13E[] = {
  NSPAIR(_ZN3ccc8FF1x6y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x6y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y13E[] = {
  {&(_ZTVN3ccc8FF1x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y13E[];
static VTBL_ENTRY alt_thunk_names350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y13E = {  "_ZN3ccc8FF1x6y13E", // class name
  bases__ZN3ccc8FF1x6y13E, 2,
  &(vtc__ZN3ccc8FF1x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names350,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y14  : virtual ::ccc::EE1x6 {
  virtual void  pqr(); // _ZN3ccc8FF1x6y143pqrEv
  ~FF1x6y14(); // tgen
  FF1x6y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x6y143pqrEv");}
ccc::FF1x6y14 ::~FF1x6y14(){ note_dtor("_ZN3ccc8FF1x6y14E", this);} // tgen
ccc::FF1x6y14 ::FF1x6y14(){ note_ctor("_ZN3ccc8FF1x6y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y14E, buf);
    ::ccc::FF1x6y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y14E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y14E);
    dp->::ccc::FF1x6y14::~FF1x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y14E(Test__ZN3ccc8FF1x6y14E, "_ZN3ccc8FF1x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y14C1Ev();
extern void _ZN3ccc8FF1x6y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y14E[] = {
  NSPAIR(_ZN3ccc8FF1x6y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x6y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x6y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y14E[] = {
  {&(_ZTVN3ccc8FF1x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y14E[];
static VTBL_ENTRY alt_thunk_names351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y14E = {  "_ZN3ccc8FF1x6y14E", // class name
  bases__ZN3ccc8FF1x6y14E, 2,
  &(vtc__ZN3ccc8FF1x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names351,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x6y15  : virtual ::ccc::EE1x6 {
  ~FF1x6y15(); // tgen
  FF1x6y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x6y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2}}
}
namespace ccc { 
ccc::FF1x6y15 ::~FF1x6y15(){ note_dtor("_ZN3ccc8FF1x6y15E", this);} // tgen
ccc::FF1x6y15 ::FF1x6y15(){ note_ctor("_ZN3ccc8FF1x6y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x6y15E, buf);
    ::ccc::FF1x6y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x6y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y15E");
    check_base_class_offset(lv, (::ccc::EE1x6*), 0, "_ZN3ccc8FF1x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x6y15E);
    dp->::ccc::FF1x6y15::~FF1x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x6y15E(Test__ZN3ccc8FF1x6y15E, "_ZN3ccc8FF1x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x6y15C1Ev();
extern void _ZN3ccc8FF1x6y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x6y15E[] = {
  NSPAIR(_ZN3ccc8FF1x6y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x6E[];
static Base_Class bases__ZN3ccc8FF1x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x6y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv)();
extern void _ZN3ccc5EE1x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv)();
extern void _ZN3ccc5EE1x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x6y15E[] = {
  {&(_ZTVN3ccc8FF1x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x6y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x6E__NS_8FF1x6y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x6y15E[];
static VTBL_ENTRY alt_thunk_names352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x63efgEv,_ZTv0_n20_N3ccc5EE1x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x63abcEv,_ZTv0_n12_N3ccc5EE1x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x6y15E = {  "_ZN3ccc8FF1x6y15E", // class name
  bases__ZN3ccc8FF1x6y15E, 2,
  &(vtc__ZN3ccc8FF1x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x6y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x6y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x6y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x6y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names352,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y0  : virtual ::ccc::EE1x7 {
  virtual void  abc(); // _ZN3ccc7FF1x7y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y03pqrEv
  ~FF1x7y0(); // tgen
  FF1x7y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y03abcEv");}
void  ccc::FF1x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y03efgEv");}
void  ccc::FF1x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y03pqrEv");}
ccc::FF1x7y0 ::~FF1x7y0(){ note_dtor("_ZN3ccc7FF1x7y0E", this);} // tgen
ccc::FF1x7y0 ::FF1x7y0(){ note_ctor("_ZN3ccc7FF1x7y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y0E, buf);
    ::ccc::FF1x7y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y0E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y0E);
    dp->::ccc::FF1x7y0::~FF1x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y0E(Test__ZN3ccc7FF1x7y0E, "_ZN3ccc7FF1x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y0C1Ev();
extern void _ZN3ccc7FF1x7y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y0E[] = {
  NSPAIR(_ZN3ccc7FF1x7y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y0E[];
extern void _ZN3ccc7FF1x7y03abcEv();
extern void _ZN3ccc7FF1x7y03pqrEv();
extern void _ZN3ccc7FF1x7y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y0E[] = {
  {&(_ZTVN3ccc7FF1x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y0E[];
static VTBL_ENTRY alt_thunk_names353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y0E = {  "_ZN3ccc7FF1x7y0E", // class name
  bases__ZN3ccc7FF1x7y0E, 2,
  &(vtc__ZN3ccc7FF1x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names353,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y1  : virtual ::ccc::EE1x7 {
  virtual void  abc(); // _ZN3ccc7FF1x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x7y13efgEv
  ~FF1x7y1(); // tgen
  FF1x7y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y13abcEv");}
void  ccc::FF1x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y13pqrEv");}
void  ccc::FF1x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y13efgEv");}
ccc::FF1x7y1 ::~FF1x7y1(){ note_dtor("_ZN3ccc7FF1x7y1E", this);} // tgen
ccc::FF1x7y1 ::FF1x7y1(){ note_ctor("_ZN3ccc7FF1x7y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y1E, buf);
    ::ccc::FF1x7y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y1E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y1E);
    dp->::ccc::FF1x7y1::~FF1x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y1E(Test__ZN3ccc7FF1x7y1E, "_ZN3ccc7FF1x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y1C1Ev();
extern void _ZN3ccc7FF1x7y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y1E[] = {
  NSPAIR(_ZN3ccc7FF1x7y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y1E[];
extern void _ZN3ccc7FF1x7y13abcEv();
extern void _ZN3ccc7FF1x7y13pqrEv();
extern void _ZN3ccc7FF1x7y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y1E[] = {
  {&(_ZTVN3ccc7FF1x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y1E[];
static VTBL_ENTRY alt_thunk_names354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y1E = {  "_ZN3ccc7FF1x7y1E", // class name
  bases__ZN3ccc7FF1x7y1E, 2,
  &(vtc__ZN3ccc7FF1x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names354,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y2  : virtual ::ccc::EE1x7 {
  virtual void  efg(); // _ZN3ccc7FF1x7y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y23pqrEv
  ~FF1x7y2(); // tgen
  FF1x7y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y23efgEv");}
void  ccc::FF1x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y23abcEv");}
void  ccc::FF1x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y23pqrEv");}
ccc::FF1x7y2 ::~FF1x7y2(){ note_dtor("_ZN3ccc7FF1x7y2E", this);} // tgen
ccc::FF1x7y2 ::FF1x7y2(){ note_ctor("_ZN3ccc7FF1x7y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y2E, buf);
    ::ccc::FF1x7y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y2E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y2E);
    dp->::ccc::FF1x7y2::~FF1x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y2E(Test__ZN3ccc7FF1x7y2E, "_ZN3ccc7FF1x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y2C1Ev();
extern void _ZN3ccc7FF1x7y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y2E[] = {
  NSPAIR(_ZN3ccc7FF1x7y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y2E[];
extern void _ZN3ccc7FF1x7y23abcEv();
extern void _ZN3ccc7FF1x7y23pqrEv();
extern void _ZN3ccc7FF1x7y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y2E[] = {
  {&(_ZTVN3ccc7FF1x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y2E[];
static VTBL_ENTRY alt_thunk_names355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y2E = {  "_ZN3ccc7FF1x7y2E", // class name
  bases__ZN3ccc7FF1x7y2E, 2,
  &(vtc__ZN3ccc7FF1x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names355,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y3  : virtual ::ccc::EE1x7 {
  virtual void  efg(); // _ZN3ccc7FF1x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x7y33abcEv
  ~FF1x7y3(); // tgen
  FF1x7y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y33efgEv");}
void  ccc::FF1x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y33pqrEv");}
void  ccc::FF1x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y33abcEv");}
ccc::FF1x7y3 ::~FF1x7y3(){ note_dtor("_ZN3ccc7FF1x7y3E", this);} // tgen
ccc::FF1x7y3 ::FF1x7y3(){ note_ctor("_ZN3ccc7FF1x7y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y3E, buf);
    ::ccc::FF1x7y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y3E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y3E);
    dp->::ccc::FF1x7y3::~FF1x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y3E(Test__ZN3ccc7FF1x7y3E, "_ZN3ccc7FF1x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y3C1Ev();
extern void _ZN3ccc7FF1x7y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y3E[] = {
  NSPAIR(_ZN3ccc7FF1x7y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y3E[];
extern void _ZN3ccc7FF1x7y33abcEv();
extern void _ZN3ccc7FF1x7y33pqrEv();
extern void _ZN3ccc7FF1x7y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y3E[] = {
  {&(_ZTVN3ccc7FF1x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y3E[];
static VTBL_ENTRY alt_thunk_names356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y3E = {  "_ZN3ccc7FF1x7y3E", // class name
  bases__ZN3ccc7FF1x7y3E, 2,
  &(vtc__ZN3ccc7FF1x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names356,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y4  : virtual ::ccc::EE1x7 {
  virtual void  pqr(); // _ZN3ccc7FF1x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x7y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x7y43efgEv
  ~FF1x7y4(); // tgen
  FF1x7y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y43pqrEv");}
void  ccc::FF1x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y43abcEv");}
void  ccc::FF1x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y43efgEv");}
ccc::FF1x7y4 ::~FF1x7y4(){ note_dtor("_ZN3ccc7FF1x7y4E", this);} // tgen
ccc::FF1x7y4 ::FF1x7y4(){ note_ctor("_ZN3ccc7FF1x7y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y4E, buf);
    ::ccc::FF1x7y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y4E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y4E);
    dp->::ccc::FF1x7y4::~FF1x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y4E(Test__ZN3ccc7FF1x7y4E, "_ZN3ccc7FF1x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y4C1Ev();
extern void _ZN3ccc7FF1x7y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y4E[] = {
  NSPAIR(_ZN3ccc7FF1x7y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y4E[];
extern void _ZN3ccc7FF1x7y43abcEv();
extern void _ZN3ccc7FF1x7y43pqrEv();
extern void _ZN3ccc7FF1x7y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y4E[] = {
  {&(_ZTVN3ccc7FF1x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y4E[];
static VTBL_ENTRY alt_thunk_names357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y4E = {  "_ZN3ccc7FF1x7y4E", // class name
  bases__ZN3ccc7FF1x7y4E, 2,
  &(vtc__ZN3ccc7FF1x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names357,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y5  : virtual ::ccc::EE1x7 {
  virtual void  pqr(); // _ZN3ccc7FF1x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x7y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x7y53abcEv
  ~FF1x7y5(); // tgen
  FF1x7y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y53pqrEv");}
void  ccc::FF1x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y53efgEv");}
void  ccc::FF1x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y53abcEv");}
ccc::FF1x7y5 ::~FF1x7y5(){ note_dtor("_ZN3ccc7FF1x7y5E", this);} // tgen
ccc::FF1x7y5 ::FF1x7y5(){ note_ctor("_ZN3ccc7FF1x7y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y5E, buf);
    ::ccc::FF1x7y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y5E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y5E);
    dp->::ccc::FF1x7y5::~FF1x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y5E(Test__ZN3ccc7FF1x7y5E, "_ZN3ccc7FF1x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y5C1Ev();
extern void _ZN3ccc7FF1x7y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y5E[] = {
  NSPAIR(_ZN3ccc7FF1x7y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y5E[];
extern void _ZN3ccc7FF1x7y53abcEv();
extern void _ZN3ccc7FF1x7y53pqrEv();
extern void _ZN3ccc7FF1x7y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y5E[] = {
  {&(_ZTVN3ccc7FF1x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y5E[];
static VTBL_ENTRY alt_thunk_names358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y5E = {  "_ZN3ccc7FF1x7y5E", // class name
  bases__ZN3ccc7FF1x7y5E, 2,
  &(vtc__ZN3ccc7FF1x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names358,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y6  : virtual ::ccc::EE1x7 {
  virtual void  abc(); // _ZN3ccc7FF1x7y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x7y63efgEv
  ~FF1x7y6(); // tgen
  FF1x7y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y63abcEv");}
void  ccc::FF1x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y63efgEv");}
ccc::FF1x7y6 ::~FF1x7y6(){ note_dtor("_ZN3ccc7FF1x7y6E", this);} // tgen
ccc::FF1x7y6 ::FF1x7y6(){ note_ctor("_ZN3ccc7FF1x7y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y6E, buf);
    ::ccc::FF1x7y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y6E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y6E);
    dp->::ccc::FF1x7y6::~FF1x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y6E(Test__ZN3ccc7FF1x7y6E, "_ZN3ccc7FF1x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y6C1Ev();
extern void _ZN3ccc7FF1x7y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y6E[] = {
  NSPAIR(_ZN3ccc7FF1x7y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y6E[];
extern void _ZN3ccc7FF1x7y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x7y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y6E[] = {
  {&(_ZTVN3ccc7FF1x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y6E[];
static VTBL_ENTRY alt_thunk_names359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y6E = {  "_ZN3ccc7FF1x7y6E", // class name
  bases__ZN3ccc7FF1x7y6E, 2,
  &(vtc__ZN3ccc7FF1x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names359,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y7  : virtual ::ccc::EE1x7 {
  virtual void  abc(); // _ZN3ccc7FF1x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y73pqrEv
  ~FF1x7y7(); // tgen
  FF1x7y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y73abcEv");}
void  ccc::FF1x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y73pqrEv");}
ccc::FF1x7y7 ::~FF1x7y7(){ note_dtor("_ZN3ccc7FF1x7y7E", this);} // tgen
ccc::FF1x7y7 ::FF1x7y7(){ note_ctor("_ZN3ccc7FF1x7y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y7E, buf);
    ::ccc::FF1x7y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y7E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y7E);
    dp->::ccc::FF1x7y7::~FF1x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y7E(Test__ZN3ccc7FF1x7y7E, "_ZN3ccc7FF1x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y7C1Ev();
extern void _ZN3ccc7FF1x7y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y7E[] = {
  NSPAIR(_ZN3ccc7FF1x7y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y7E[];
extern void _ZN3ccc7FF1x7y73abcEv();
extern void _ZN3ccc7FF1x7y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y7E[] = {
  {&(_ZTVN3ccc7FF1x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y7E[];
static VTBL_ENTRY alt_thunk_names360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y7E = {  "_ZN3ccc7FF1x7y7E", // class name
  bases__ZN3ccc7FF1x7y7E, 2,
  &(vtc__ZN3ccc7FF1x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names360,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y8  : virtual ::ccc::EE1x7 {
  virtual void  efg(); // _ZN3ccc7FF1x7y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x7y83abcEv
  ~FF1x7y8(); // tgen
  FF1x7y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y83efgEv");}
void  ccc::FF1x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x7y83abcEv");}
ccc::FF1x7y8 ::~FF1x7y8(){ note_dtor("_ZN3ccc7FF1x7y8E", this);} // tgen
ccc::FF1x7y8 ::FF1x7y8(){ note_ctor("_ZN3ccc7FF1x7y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y8E, buf);
    ::ccc::FF1x7y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y8E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y8E);
    dp->::ccc::FF1x7y8::~FF1x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y8E(Test__ZN3ccc7FF1x7y8E, "_ZN3ccc7FF1x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y8C1Ev();
extern void _ZN3ccc7FF1x7y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y8E[] = {
  NSPAIR(_ZN3ccc7FF1x7y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y8E[];
extern void _ZN3ccc7FF1x7y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x7y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y8E[] = {
  {&(_ZTVN3ccc7FF1x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y8E[];
static VTBL_ENTRY alt_thunk_names361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y8E = {  "_ZN3ccc7FF1x7y8E", // class name
  bases__ZN3ccc7FF1x7y8E, 2,
  &(vtc__ZN3ccc7FF1x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names361,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y9  : virtual ::ccc::EE1x7 {
  virtual void  efg(); // _ZN3ccc7FF1x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x7y93pqrEv
  ~FF1x7y9(); // tgen
  FF1x7y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x7y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x7y93efgEv");}
void  ccc::FF1x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x7y93pqrEv");}
ccc::FF1x7y9 ::~FF1x7y9(){ note_dtor("_ZN3ccc7FF1x7y9E", this);} // tgen
ccc::FF1x7y9 ::FF1x7y9(){ note_ctor("_ZN3ccc7FF1x7y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x7y9E, buf);
    ::ccc::FF1x7y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x7y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y9E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc7FF1x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x7y9E);
    dp->::ccc::FF1x7y9::~FF1x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x7y9E(Test__ZN3ccc7FF1x7y9E, "_ZN3ccc7FF1x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x7y9C1Ev();
extern void _ZN3ccc7FF1x7y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x7y9E[] = {
  NSPAIR(_ZN3ccc7FF1x7y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc7FF1x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x7y93pqrEv();
extern void _ZN3ccc7FF1x7y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x7y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x7y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x7y9E[] = {
  {&(_ZTVN3ccc7FF1x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x7y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_7FF1x7y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x7y9E[];
static VTBL_ENTRY alt_thunk_names362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x7y9E = {  "_ZN3ccc7FF1x7y9E", // class name
  bases__ZN3ccc7FF1x7y9E, 2,
  &(vtc__ZN3ccc7FF1x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x7y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x7y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x7y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x7y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names362,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y10  : virtual ::ccc::EE1x7 {
  virtual void  pqr(); // _ZN3ccc8FF1x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x7y103abcEv
  ~FF1x7y10(); // tgen
  FF1x7y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x7y103pqrEv");}
void  ccc::FF1x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x7y103abcEv");}
ccc::FF1x7y10 ::~FF1x7y10(){ note_dtor("_ZN3ccc8FF1x7y10E", this);} // tgen
ccc::FF1x7y10 ::FF1x7y10(){ note_ctor("_ZN3ccc8FF1x7y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y10E, buf);
    ::ccc::FF1x7y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y10E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y10E);
    dp->::ccc::FF1x7y10::~FF1x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y10E(Test__ZN3ccc8FF1x7y10E, "_ZN3ccc8FF1x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y10C1Ev();
extern void _ZN3ccc8FF1x7y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y10E[] = {
  NSPAIR(_ZN3ccc8FF1x7y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y10E[];
extern void _ZN3ccc8FF1x7y103abcEv();
extern void _ZN3ccc8FF1x7y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y10E[] = {
  {&(_ZTVN3ccc8FF1x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y10E[];
static VTBL_ENTRY alt_thunk_names363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y10E = {  "_ZN3ccc8FF1x7y10E", // class name
  bases__ZN3ccc8FF1x7y10E, 2,
  &(vtc__ZN3ccc8FF1x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names363,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y11  : virtual ::ccc::EE1x7 {
  virtual void  pqr(); // _ZN3ccc8FF1x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x7y113efgEv
  ~FF1x7y11(); // tgen
  FF1x7y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x7y113pqrEv");}
void  ccc::FF1x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x7y113efgEv");}
ccc::FF1x7y11 ::~FF1x7y11(){ note_dtor("_ZN3ccc8FF1x7y11E", this);} // tgen
ccc::FF1x7y11 ::FF1x7y11(){ note_ctor("_ZN3ccc8FF1x7y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y11E, buf);
    ::ccc::FF1x7y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y11E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y11E);
    dp->::ccc::FF1x7y11::~FF1x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y11E(Test__ZN3ccc8FF1x7y11E, "_ZN3ccc8FF1x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y11C1Ev();
extern void _ZN3ccc8FF1x7y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y11E[] = {
  NSPAIR(_ZN3ccc8FF1x7y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x7y113pqrEv();
extern void _ZN3ccc8FF1x7y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y11E[] = {
  {&(_ZTVN3ccc8FF1x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y11E[];
static VTBL_ENTRY alt_thunk_names364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y11E = {  "_ZN3ccc8FF1x7y11E", // class name
  bases__ZN3ccc8FF1x7y11E, 2,
  &(vtc__ZN3ccc8FF1x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names364,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y12  : virtual ::ccc::EE1x7 {
  virtual void  abc(); // _ZN3ccc8FF1x7y123abcEv
  ~FF1x7y12(); // tgen
  FF1x7y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x7y123abcEv");}
ccc::FF1x7y12 ::~FF1x7y12(){ note_dtor("_ZN3ccc8FF1x7y12E", this);} // tgen
ccc::FF1x7y12 ::FF1x7y12(){ note_ctor("_ZN3ccc8FF1x7y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y12E, buf);
    ::ccc::FF1x7y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y12E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y12E);
    dp->::ccc::FF1x7y12::~FF1x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y12E(Test__ZN3ccc8FF1x7y12E, "_ZN3ccc8FF1x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y12C1Ev();
extern void _ZN3ccc8FF1x7y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y12E[] = {
  NSPAIR(_ZN3ccc8FF1x7y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y12E[];
extern void _ZN3ccc8FF1x7y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y12E[] = {
  {&(_ZTVN3ccc8FF1x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y12E[];
static VTBL_ENTRY alt_thunk_names365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y12E = {  "_ZN3ccc8FF1x7y12E", // class name
  bases__ZN3ccc8FF1x7y12E, 2,
  &(vtc__ZN3ccc8FF1x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names365,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y13  : virtual ::ccc::EE1x7 {
  virtual void  efg(); // _ZN3ccc8FF1x7y133efgEv
  ~FF1x7y13(); // tgen
  FF1x7y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x7y133efgEv");}
ccc::FF1x7y13 ::~FF1x7y13(){ note_dtor("_ZN3ccc8FF1x7y13E", this);} // tgen
ccc::FF1x7y13 ::FF1x7y13(){ note_ctor("_ZN3ccc8FF1x7y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y13E, buf);
    ::ccc::FF1x7y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y13E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y13E);
    dp->::ccc::FF1x7y13::~FF1x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y13E(Test__ZN3ccc8FF1x7y13E, "_ZN3ccc8FF1x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y13C1Ev();
extern void _ZN3ccc8FF1x7y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y13E[] = {
  NSPAIR(_ZN3ccc8FF1x7y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x7y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y13E[] = {
  {&(_ZTVN3ccc8FF1x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y13E[];
static VTBL_ENTRY alt_thunk_names366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y13E = {  "_ZN3ccc8FF1x7y13E", // class name
  bases__ZN3ccc8FF1x7y13E, 2,
  &(vtc__ZN3ccc8FF1x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names366,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y14  : virtual ::ccc::EE1x7 {
  virtual void  pqr(); // _ZN3ccc8FF1x7y143pqrEv
  ~FF1x7y14(); // tgen
  FF1x7y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x7y143pqrEv");}
ccc::FF1x7y14 ::~FF1x7y14(){ note_dtor("_ZN3ccc8FF1x7y14E", this);} // tgen
ccc::FF1x7y14 ::FF1x7y14(){ note_ctor("_ZN3ccc8FF1x7y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y14E, buf);
    ::ccc::FF1x7y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y14E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y14E);
    dp->::ccc::FF1x7y14::~FF1x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y14E(Test__ZN3ccc8FF1x7y14E, "_ZN3ccc8FF1x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y14C1Ev();
extern void _ZN3ccc8FF1x7y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y14E[] = {
  NSPAIR(_ZN3ccc8FF1x7y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x7y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y14E[] = {
  {&(_ZTVN3ccc8FF1x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y14E[];
static VTBL_ENTRY alt_thunk_names367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y14E = {  "_ZN3ccc8FF1x7y14E", // class name
  bases__ZN3ccc8FF1x7y14E, 2,
  &(vtc__ZN3ccc8FF1x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names367,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x7y15  : virtual ::ccc::EE1x7 {
  ~FF1x7y15(); // tgen
  FF1x7y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x7y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2}}
}
namespace ccc { 
ccc::FF1x7y15 ::~FF1x7y15(){ note_dtor("_ZN3ccc8FF1x7y15E", this);} // tgen
ccc::FF1x7y15 ::FF1x7y15(){ note_ctor("_ZN3ccc8FF1x7y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x7y15E, buf);
    ::ccc::FF1x7y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x7y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y15E");
    check_base_class_offset(lv, (::ccc::EE1x7*), 0, "_ZN3ccc8FF1x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x7y15E);
    dp->::ccc::FF1x7y15::~FF1x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x7y15E(Test__ZN3ccc8FF1x7y15E, "_ZN3ccc8FF1x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x7y15C1Ev();
extern void _ZN3ccc8FF1x7y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x7y15E[] = {
  NSPAIR(_ZN3ccc8FF1x7y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x7E[];
static Base_Class bases__ZN3ccc8FF1x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x7y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv)();
extern void _ZN3ccc5EE1x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv)();
extern void _ZN3ccc5EE1x73pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x7y15E[] = {
  {&(_ZTVN3ccc8FF1x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x7y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x7E__NS_8FF1x7y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x7y15E[];
static VTBL_ENTRY alt_thunk_names368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x73pqrEv,_ZTv0_n16_N3ccc5EE1x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x73abcEv,_ZTv0_n12_N3ccc5EE1x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x7y15E = {  "_ZN3ccc8FF1x7y15E", // class name
  bases__ZN3ccc8FF1x7y15E, 2,
  &(vtc__ZN3ccc8FF1x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x7y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x7y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x7y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x7y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names368,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y0  : virtual ::ccc::EE1x8 {
  virtual void  abc(); // _ZN3ccc7FF1x8y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y03pqrEv
  ~FF1x8y0(); // tgen
  FF1x8y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y03abcEv");}
void  ccc::FF1x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y03efgEv");}
void  ccc::FF1x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y03pqrEv");}
ccc::FF1x8y0 ::~FF1x8y0(){ note_dtor("_ZN3ccc7FF1x8y0E", this);} // tgen
ccc::FF1x8y0 ::FF1x8y0(){ note_ctor("_ZN3ccc7FF1x8y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y0E, buf);
    ::ccc::FF1x8y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y0E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y0E);
    dp->::ccc::FF1x8y0::~FF1x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y0E(Test__ZN3ccc7FF1x8y0E, "_ZN3ccc7FF1x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y0C1Ev();
extern void _ZN3ccc7FF1x8y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y0E[] = {
  NSPAIR(_ZN3ccc7FF1x8y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y0E[];
extern void _ZN3ccc7FF1x8y03abcEv();
extern void _ZN3ccc7FF1x8y03pqrEv();
extern void _ZN3ccc7FF1x8y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y0E[] = {
  {&(_ZTVN3ccc7FF1x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y0E[];
static VTBL_ENTRY alt_thunk_names369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y0E = {  "_ZN3ccc7FF1x8y0E", // class name
  bases__ZN3ccc7FF1x8y0E, 2,
  &(vtc__ZN3ccc7FF1x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names369,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y1  : virtual ::ccc::EE1x8 {
  virtual void  abc(); // _ZN3ccc7FF1x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x8y13efgEv
  ~FF1x8y1(); // tgen
  FF1x8y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y13abcEv");}
void  ccc::FF1x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y13pqrEv");}
void  ccc::FF1x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y13efgEv");}
ccc::FF1x8y1 ::~FF1x8y1(){ note_dtor("_ZN3ccc7FF1x8y1E", this);} // tgen
ccc::FF1x8y1 ::FF1x8y1(){ note_ctor("_ZN3ccc7FF1x8y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y1E, buf);
    ::ccc::FF1x8y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y1E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y1E);
    dp->::ccc::FF1x8y1::~FF1x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y1E(Test__ZN3ccc7FF1x8y1E, "_ZN3ccc7FF1x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y1C1Ev();
extern void _ZN3ccc7FF1x8y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y1E[] = {
  NSPAIR(_ZN3ccc7FF1x8y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y1E[];
extern void _ZN3ccc7FF1x8y13abcEv();
extern void _ZN3ccc7FF1x8y13pqrEv();
extern void _ZN3ccc7FF1x8y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y1E[] = {
  {&(_ZTVN3ccc7FF1x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y1E[];
static VTBL_ENTRY alt_thunk_names370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y1E = {  "_ZN3ccc7FF1x8y1E", // class name
  bases__ZN3ccc7FF1x8y1E, 2,
  &(vtc__ZN3ccc7FF1x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names370,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y2  : virtual ::ccc::EE1x8 {
  virtual void  efg(); // _ZN3ccc7FF1x8y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y23pqrEv
  ~FF1x8y2(); // tgen
  FF1x8y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y23efgEv");}
void  ccc::FF1x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y23abcEv");}
void  ccc::FF1x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y23pqrEv");}
ccc::FF1x8y2 ::~FF1x8y2(){ note_dtor("_ZN3ccc7FF1x8y2E", this);} // tgen
ccc::FF1x8y2 ::FF1x8y2(){ note_ctor("_ZN3ccc7FF1x8y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y2E, buf);
    ::ccc::FF1x8y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y2E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y2E);
    dp->::ccc::FF1x8y2::~FF1x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y2E(Test__ZN3ccc7FF1x8y2E, "_ZN3ccc7FF1x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y2C1Ev();
extern void _ZN3ccc7FF1x8y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y2E[] = {
  NSPAIR(_ZN3ccc7FF1x8y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y2E[];
extern void _ZN3ccc7FF1x8y23abcEv();
extern void _ZN3ccc7FF1x8y23pqrEv();
extern void _ZN3ccc7FF1x8y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y2E[] = {
  {&(_ZTVN3ccc7FF1x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y2E[];
static VTBL_ENTRY alt_thunk_names371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y2E = {  "_ZN3ccc7FF1x8y2E", // class name
  bases__ZN3ccc7FF1x8y2E, 2,
  &(vtc__ZN3ccc7FF1x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names371,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y3  : virtual ::ccc::EE1x8 {
  virtual void  efg(); // _ZN3ccc7FF1x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x8y33abcEv
  ~FF1x8y3(); // tgen
  FF1x8y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y33efgEv");}
void  ccc::FF1x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y33pqrEv");}
void  ccc::FF1x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y33abcEv");}
ccc::FF1x8y3 ::~FF1x8y3(){ note_dtor("_ZN3ccc7FF1x8y3E", this);} // tgen
ccc::FF1x8y3 ::FF1x8y3(){ note_ctor("_ZN3ccc7FF1x8y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y3E, buf);
    ::ccc::FF1x8y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y3E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y3E);
    dp->::ccc::FF1x8y3::~FF1x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y3E(Test__ZN3ccc7FF1x8y3E, "_ZN3ccc7FF1x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y3C1Ev();
extern void _ZN3ccc7FF1x8y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y3E[] = {
  NSPAIR(_ZN3ccc7FF1x8y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y3E[];
extern void _ZN3ccc7FF1x8y33abcEv();
extern void _ZN3ccc7FF1x8y33pqrEv();
extern void _ZN3ccc7FF1x8y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y3E[] = {
  {&(_ZTVN3ccc7FF1x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y3E[];
static VTBL_ENTRY alt_thunk_names372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y3E = {  "_ZN3ccc7FF1x8y3E", // class name
  bases__ZN3ccc7FF1x8y3E, 2,
  &(vtc__ZN3ccc7FF1x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names372,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y4  : virtual ::ccc::EE1x8 {
  virtual void  pqr(); // _ZN3ccc7FF1x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x8y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x8y43efgEv
  ~FF1x8y4(); // tgen
  FF1x8y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y43pqrEv");}
void  ccc::FF1x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y43abcEv");}
void  ccc::FF1x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y43efgEv");}
ccc::FF1x8y4 ::~FF1x8y4(){ note_dtor("_ZN3ccc7FF1x8y4E", this);} // tgen
ccc::FF1x8y4 ::FF1x8y4(){ note_ctor("_ZN3ccc7FF1x8y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y4E, buf);
    ::ccc::FF1x8y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y4E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y4E);
    dp->::ccc::FF1x8y4::~FF1x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y4E(Test__ZN3ccc7FF1x8y4E, "_ZN3ccc7FF1x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y4C1Ev();
extern void _ZN3ccc7FF1x8y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y4E[] = {
  NSPAIR(_ZN3ccc7FF1x8y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y4E[];
extern void _ZN3ccc7FF1x8y43abcEv();
extern void _ZN3ccc7FF1x8y43pqrEv();
extern void _ZN3ccc7FF1x8y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y4E[] = {
  {&(_ZTVN3ccc7FF1x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y4E[];
static VTBL_ENTRY alt_thunk_names373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y4E = {  "_ZN3ccc7FF1x8y4E", // class name
  bases__ZN3ccc7FF1x8y4E, 2,
  &(vtc__ZN3ccc7FF1x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names373,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y5  : virtual ::ccc::EE1x8 {
  virtual void  pqr(); // _ZN3ccc7FF1x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x8y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x8y53abcEv
  ~FF1x8y5(); // tgen
  FF1x8y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y53pqrEv");}
void  ccc::FF1x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y53efgEv");}
void  ccc::FF1x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y53abcEv");}
ccc::FF1x8y5 ::~FF1x8y5(){ note_dtor("_ZN3ccc7FF1x8y5E", this);} // tgen
ccc::FF1x8y5 ::FF1x8y5(){ note_ctor("_ZN3ccc7FF1x8y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y5E, buf);
    ::ccc::FF1x8y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y5E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y5E);
    dp->::ccc::FF1x8y5::~FF1x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y5E(Test__ZN3ccc7FF1x8y5E, "_ZN3ccc7FF1x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y5C1Ev();
extern void _ZN3ccc7FF1x8y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y5E[] = {
  NSPAIR(_ZN3ccc7FF1x8y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y5E[];
extern void _ZN3ccc7FF1x8y53abcEv();
extern void _ZN3ccc7FF1x8y53pqrEv();
extern void _ZN3ccc7FF1x8y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y5E[] = {
  {&(_ZTVN3ccc7FF1x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y5E[];
static VTBL_ENTRY alt_thunk_names374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y5E = {  "_ZN3ccc7FF1x8y5E", // class name
  bases__ZN3ccc7FF1x8y5E, 2,
  &(vtc__ZN3ccc7FF1x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names374,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y6  : virtual ::ccc::EE1x8 {
  virtual void  abc(); // _ZN3ccc7FF1x8y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x8y63efgEv
  ~FF1x8y6(); // tgen
  FF1x8y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y63abcEv");}
void  ccc::FF1x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y63efgEv");}
ccc::FF1x8y6 ::~FF1x8y6(){ note_dtor("_ZN3ccc7FF1x8y6E", this);} // tgen
ccc::FF1x8y6 ::FF1x8y6(){ note_ctor("_ZN3ccc7FF1x8y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y6E, buf);
    ::ccc::FF1x8y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y6E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y6E);
    dp->::ccc::FF1x8y6::~FF1x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y6E(Test__ZN3ccc7FF1x8y6E, "_ZN3ccc7FF1x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y6C1Ev();
extern void _ZN3ccc7FF1x8y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y6E[] = {
  NSPAIR(_ZN3ccc7FF1x8y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y6E[];
extern void _ZN3ccc7FF1x8y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7FF1x8y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y6E[] = {
  {&(_ZTVN3ccc7FF1x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y6E[];
static VTBL_ENTRY alt_thunk_names375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y6E = {  "_ZN3ccc7FF1x8y6E", // class name
  bases__ZN3ccc7FF1x8y6E, 2,
  &(vtc__ZN3ccc7FF1x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names375,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y7  : virtual ::ccc::EE1x8 {
  virtual void  abc(); // _ZN3ccc7FF1x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y73pqrEv
  ~FF1x8y7(); // tgen
  FF1x8y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y73abcEv");}
void  ccc::FF1x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y73pqrEv");}
ccc::FF1x8y7 ::~FF1x8y7(){ note_dtor("_ZN3ccc7FF1x8y7E", this);} // tgen
ccc::FF1x8y7 ::FF1x8y7(){ note_ctor("_ZN3ccc7FF1x8y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y7E, buf);
    ::ccc::FF1x8y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y7E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y7E);
    dp->::ccc::FF1x8y7::~FF1x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y7E(Test__ZN3ccc7FF1x8y7E, "_ZN3ccc7FF1x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y7C1Ev();
extern void _ZN3ccc7FF1x8y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y7E[] = {
  NSPAIR(_ZN3ccc7FF1x8y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y7E[];
extern void _ZN3ccc7FF1x8y73abcEv();
extern void _ZN3ccc7FF1x8y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y7E[] = {
  {&(_ZTVN3ccc7FF1x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y7E[];
static VTBL_ENTRY alt_thunk_names376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y7E = {  "_ZN3ccc7FF1x8y7E", // class name
  bases__ZN3ccc7FF1x8y7E, 2,
  &(vtc__ZN3ccc7FF1x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names376,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y8  : virtual ::ccc::EE1x8 {
  virtual void  efg(); // _ZN3ccc7FF1x8y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x8y83abcEv
  ~FF1x8y8(); // tgen
  FF1x8y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y83efgEv");}
void  ccc::FF1x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x8y83abcEv");}
ccc::FF1x8y8 ::~FF1x8y8(){ note_dtor("_ZN3ccc7FF1x8y8E", this);} // tgen
ccc::FF1x8y8 ::FF1x8y8(){ note_ctor("_ZN3ccc7FF1x8y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y8E, buf);
    ::ccc::FF1x8y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y8E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y8E);
    dp->::ccc::FF1x8y8::~FF1x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y8E(Test__ZN3ccc7FF1x8y8E, "_ZN3ccc7FF1x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y8C1Ev();
extern void _ZN3ccc7FF1x8y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y8E[] = {
  NSPAIR(_ZN3ccc7FF1x8y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y8E[];
extern void _ZN3ccc7FF1x8y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7FF1x8y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y8E[] = {
  {&(_ZTVN3ccc7FF1x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y8E[];
static VTBL_ENTRY alt_thunk_names377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y8E = {  "_ZN3ccc7FF1x8y8E", // class name
  bases__ZN3ccc7FF1x8y8E, 2,
  &(vtc__ZN3ccc7FF1x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names377,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y9  : virtual ::ccc::EE1x8 {
  virtual void  efg(); // _ZN3ccc7FF1x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x8y93pqrEv
  ~FF1x8y9(); // tgen
  FF1x8y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x8y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x8y93efgEv");}
void  ccc::FF1x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x8y93pqrEv");}
ccc::FF1x8y9 ::~FF1x8y9(){ note_dtor("_ZN3ccc7FF1x8y9E", this);} // tgen
ccc::FF1x8y9 ::FF1x8y9(){ note_ctor("_ZN3ccc7FF1x8y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x8y9E, buf);
    ::ccc::FF1x8y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x8y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y9E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc7FF1x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x8y9E);
    dp->::ccc::FF1x8y9::~FF1x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x8y9E(Test__ZN3ccc7FF1x8y9E, "_ZN3ccc7FF1x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x8y9C1Ev();
extern void _ZN3ccc7FF1x8y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x8y9E[] = {
  NSPAIR(_ZN3ccc7FF1x8y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc7FF1x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc7FF1x8y93pqrEv();
extern void _ZN3ccc7FF1x8y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x8y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x8y9E[] = {
  {&(_ZTVN3ccc7FF1x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x8y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_7FF1x8y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x8y9E[];
static VTBL_ENTRY alt_thunk_names378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x8y9E = {  "_ZN3ccc7FF1x8y9E", // class name
  bases__ZN3ccc7FF1x8y9E, 2,
  &(vtc__ZN3ccc7FF1x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x8y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x8y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x8y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x8y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names378,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y10  : virtual ::ccc::EE1x8 {
  virtual void  pqr(); // _ZN3ccc8FF1x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x8y103abcEv
  ~FF1x8y10(); // tgen
  FF1x8y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x8y103pqrEv");}
void  ccc::FF1x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x8y103abcEv");}
ccc::FF1x8y10 ::~FF1x8y10(){ note_dtor("_ZN3ccc8FF1x8y10E", this);} // tgen
ccc::FF1x8y10 ::FF1x8y10(){ note_ctor("_ZN3ccc8FF1x8y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y10E, buf);
    ::ccc::FF1x8y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y10E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y10E);
    dp->::ccc::FF1x8y10::~FF1x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y10E(Test__ZN3ccc8FF1x8y10E, "_ZN3ccc8FF1x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y10C1Ev();
extern void _ZN3ccc8FF1x8y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y10E[] = {
  NSPAIR(_ZN3ccc8FF1x8y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y10E[];
extern void _ZN3ccc8FF1x8y103abcEv();
extern void _ZN3ccc8FF1x8y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y10E[] = {
  {&(_ZTVN3ccc8FF1x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y10E[];
static VTBL_ENTRY alt_thunk_names379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y10E = {  "_ZN3ccc8FF1x8y10E", // class name
  bases__ZN3ccc8FF1x8y10E, 2,
  &(vtc__ZN3ccc8FF1x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names379,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y11  : virtual ::ccc::EE1x8 {
  virtual void  pqr(); // _ZN3ccc8FF1x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x8y113efgEv
  ~FF1x8y11(); // tgen
  FF1x8y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x8y113pqrEv");}
void  ccc::FF1x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x8y113efgEv");}
ccc::FF1x8y11 ::~FF1x8y11(){ note_dtor("_ZN3ccc8FF1x8y11E", this);} // tgen
ccc::FF1x8y11 ::FF1x8y11(){ note_ctor("_ZN3ccc8FF1x8y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y11E, buf);
    ::ccc::FF1x8y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y11E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y11E);
    dp->::ccc::FF1x8y11::~FF1x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y11E(Test__ZN3ccc8FF1x8y11E, "_ZN3ccc8FF1x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y11C1Ev();
extern void _ZN3ccc8FF1x8y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y11E[] = {
  NSPAIR(_ZN3ccc8FF1x8y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x8y113pqrEv();
extern void _ZN3ccc8FF1x8y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y11E[] = {
  {&(_ZTVN3ccc8FF1x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y11E[];
static VTBL_ENTRY alt_thunk_names380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y11E = {  "_ZN3ccc8FF1x8y11E", // class name
  bases__ZN3ccc8FF1x8y11E, 2,
  &(vtc__ZN3ccc8FF1x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names380,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y12  : virtual ::ccc::EE1x8 {
  virtual void  abc(); // _ZN3ccc8FF1x8y123abcEv
  ~FF1x8y12(); // tgen
  FF1x8y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x8y123abcEv");}
ccc::FF1x8y12 ::~FF1x8y12(){ note_dtor("_ZN3ccc8FF1x8y12E", this);} // tgen
ccc::FF1x8y12 ::FF1x8y12(){ note_ctor("_ZN3ccc8FF1x8y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y12E, buf);
    ::ccc::FF1x8y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y12E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y12E);
    dp->::ccc::FF1x8y12::~FF1x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y12E(Test__ZN3ccc8FF1x8y12E, "_ZN3ccc8FF1x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y12C1Ev();
extern void _ZN3ccc8FF1x8y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y12E[] = {
  NSPAIR(_ZN3ccc8FF1x8y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y12E[];
extern void _ZN3ccc8FF1x8y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y12E[] = {
  {&(_ZTVN3ccc8FF1x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y12E[];
static VTBL_ENTRY alt_thunk_names381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y12E = {  "_ZN3ccc8FF1x8y12E", // class name
  bases__ZN3ccc8FF1x8y12E, 2,
  &(vtc__ZN3ccc8FF1x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names381,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y13  : virtual ::ccc::EE1x8 {
  virtual void  efg(); // _ZN3ccc8FF1x8y133efgEv
  ~FF1x8y13(); // tgen
  FF1x8y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x8y133efgEv");}
ccc::FF1x8y13 ::~FF1x8y13(){ note_dtor("_ZN3ccc8FF1x8y13E", this);} // tgen
ccc::FF1x8y13 ::FF1x8y13(){ note_ctor("_ZN3ccc8FF1x8y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y13E, buf);
    ::ccc::FF1x8y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y13E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y13E);
    dp->::ccc::FF1x8y13::~FF1x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y13E(Test__ZN3ccc8FF1x8y13E, "_ZN3ccc8FF1x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y13C1Ev();
extern void _ZN3ccc8FF1x8y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y13E[] = {
  NSPAIR(_ZN3ccc8FF1x8y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x8y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y13E[] = {
  {&(_ZTVN3ccc8FF1x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y13E[];
static VTBL_ENTRY alt_thunk_names382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y13E = {  "_ZN3ccc8FF1x8y13E", // class name
  bases__ZN3ccc8FF1x8y13E, 2,
  &(vtc__ZN3ccc8FF1x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names382,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y14  : virtual ::ccc::EE1x8 {
  virtual void  pqr(); // _ZN3ccc8FF1x8y143pqrEv
  ~FF1x8y14(); // tgen
  FF1x8y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x8y143pqrEv");}
ccc::FF1x8y14 ::~FF1x8y14(){ note_dtor("_ZN3ccc8FF1x8y14E", this);} // tgen
ccc::FF1x8y14 ::FF1x8y14(){ note_ctor("_ZN3ccc8FF1x8y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y14E, buf);
    ::ccc::FF1x8y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y14E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y14E);
    dp->::ccc::FF1x8y14::~FF1x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y14E(Test__ZN3ccc8FF1x8y14E, "_ZN3ccc8FF1x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y14C1Ev();
extern void _ZN3ccc8FF1x8y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y14E[] = {
  NSPAIR(_ZN3ccc8FF1x8y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x8y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x8y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y14E[] = {
  {&(_ZTVN3ccc8FF1x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y14E[];
static VTBL_ENTRY alt_thunk_names383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y14E = {  "_ZN3ccc8FF1x8y14E", // class name
  bases__ZN3ccc8FF1x8y14E, 2,
  &(vtc__ZN3ccc8FF1x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names383,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x8y15  : virtual ::ccc::EE1x8 {
  ~FF1x8y15(); // tgen
  FF1x8y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x8y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2}}
}
namespace ccc { 
ccc::FF1x8y15 ::~FF1x8y15(){ note_dtor("_ZN3ccc8FF1x8y15E", this);} // tgen
ccc::FF1x8y15 ::FF1x8y15(){ note_ctor("_ZN3ccc8FF1x8y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x8y15E, buf);
    ::ccc::FF1x8y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x8y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y15E");
    check_base_class_offset(lv, (::ccc::EE1x8*), 0, "_ZN3ccc8FF1x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x8y15E);
    dp->::ccc::FF1x8y15::~FF1x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x8y15E(Test__ZN3ccc8FF1x8y15E, "_ZN3ccc8FF1x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x8y15C1Ev();
extern void _ZN3ccc8FF1x8y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x8y15E[] = {
  NSPAIR(_ZN3ccc8FF1x8y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x8E[];
static Base_Class bases__ZN3ccc8FF1x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x8y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv)();
extern void _ZN3ccc5EE1x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv)();
extern void _ZN3ccc5EE1x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x8y15E[] = {
  {&(_ZTVN3ccc8FF1x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x8y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x8E__NS_8FF1x8y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x8y15E[];
static VTBL_ENTRY alt_thunk_names384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x83efgEv,_ZTv0_n20_N3ccc5EE1x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE1x83abcEv,_ZTv0_n12_N3ccc5EE1x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x8y15E = {  "_ZN3ccc8FF1x8y15E", // class name
  bases__ZN3ccc8FF1x8y15E, 2,
  &(vtc__ZN3ccc8FF1x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x8y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x8y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x8y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x8y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names384,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y0  : virtual ::ccc::EE1x9 {
  virtual void  abc(); // _ZN3ccc7FF1x9y03abcEv
  virtual void  efg(); // _ZN3ccc7FF1x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y03pqrEv
  ~FF1x9y0(); // tgen
  FF1x9y0(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y03abcEv");}
void  ccc::FF1x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y03efgEv");}
void  ccc::FF1x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y03pqrEv");}
ccc::FF1x9y0 ::~FF1x9y0(){ note_dtor("_ZN3ccc7FF1x9y0E", this);} // tgen
ccc::FF1x9y0 ::FF1x9y0(){ note_ctor("_ZN3ccc7FF1x9y0E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y0E, buf);
    ::ccc::FF1x9y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y0E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y0E);
    dp->::ccc::FF1x9y0::~FF1x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y0E(Test__ZN3ccc7FF1x9y0E, "_ZN3ccc7FF1x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y0C1Ev();
extern void _ZN3ccc7FF1x9y0D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y0E[] = {
  NSPAIR(_ZN3ccc7FF1x9y0C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y0E[];
extern void _ZN3ccc7FF1x9y03abcEv();
extern void _ZN3ccc7FF1x9y03pqrEv();
extern void _ZN3ccc7FF1x9y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y0E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y0E[] = {
  {&(_ZTVN3ccc7FF1x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y0E[];
static VTBL_ENTRY alt_thunk_names385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y0E = {  "_ZN3ccc7FF1x9y0E", // class name
  bases__ZN3ccc7FF1x9y0E, 2,
  &(vtc__ZN3ccc7FF1x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names385,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y1  : virtual ::ccc::EE1x9 {
  virtual void  abc(); // _ZN3ccc7FF1x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x9y13efgEv
  ~FF1x9y1(); // tgen
  FF1x9y1(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y13abcEv");}
void  ccc::FF1x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y13pqrEv");}
void  ccc::FF1x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y13efgEv");}
ccc::FF1x9y1 ::~FF1x9y1(){ note_dtor("_ZN3ccc7FF1x9y1E", this);} // tgen
ccc::FF1x9y1 ::FF1x9y1(){ note_ctor("_ZN3ccc7FF1x9y1E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y1E, buf);
    ::ccc::FF1x9y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y1E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y1E);
    dp->::ccc::FF1x9y1::~FF1x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y1E(Test__ZN3ccc7FF1x9y1E, "_ZN3ccc7FF1x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y1C1Ev();
extern void _ZN3ccc7FF1x9y1D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y1E[] = {
  NSPAIR(_ZN3ccc7FF1x9y1C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y1E[];
extern void _ZN3ccc7FF1x9y13abcEv();
extern void _ZN3ccc7FF1x9y13pqrEv();
extern void _ZN3ccc7FF1x9y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y1E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y1E[] = {
  {&(_ZTVN3ccc7FF1x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y1E[];
static VTBL_ENTRY alt_thunk_names386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y1E = {  "_ZN3ccc7FF1x9y1E", // class name
  bases__ZN3ccc7FF1x9y1E, 2,
  &(vtc__ZN3ccc7FF1x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names386,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y2  : virtual ::ccc::EE1x9 {
  virtual void  efg(); // _ZN3ccc7FF1x9y23efgEv
  virtual void  abc(); // _ZN3ccc7FF1x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y23pqrEv
  ~FF1x9y2(); // tgen
  FF1x9y2(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y23efgEv");}
void  ccc::FF1x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y23abcEv");}
void  ccc::FF1x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y23pqrEv");}
ccc::FF1x9y2 ::~FF1x9y2(){ note_dtor("_ZN3ccc7FF1x9y2E", this);} // tgen
ccc::FF1x9y2 ::FF1x9y2(){ note_ctor("_ZN3ccc7FF1x9y2E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y2E, buf);
    ::ccc::FF1x9y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y2E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y2E);
    dp->::ccc::FF1x9y2::~FF1x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y2E(Test__ZN3ccc7FF1x9y2E, "_ZN3ccc7FF1x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y2C1Ev();
extern void _ZN3ccc7FF1x9y2D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y2E[] = {
  NSPAIR(_ZN3ccc7FF1x9y2C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y2E[];
extern void _ZN3ccc7FF1x9y23abcEv();
extern void _ZN3ccc7FF1x9y23pqrEv();
extern void _ZN3ccc7FF1x9y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y2E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y2E[] = {
  {&(_ZTVN3ccc7FF1x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y2E[];
static VTBL_ENTRY alt_thunk_names387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y2E = {  "_ZN3ccc7FF1x9y2E", // class name
  bases__ZN3ccc7FF1x9y2E, 2,
  &(vtc__ZN3ccc7FF1x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names387,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y3  : virtual ::ccc::EE1x9 {
  virtual void  efg(); // _ZN3ccc7FF1x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x9y33abcEv
  ~FF1x9y3(); // tgen
  FF1x9y3(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y33efgEv");}
void  ccc::FF1x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y33pqrEv");}
void  ccc::FF1x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y33abcEv");}
ccc::FF1x9y3 ::~FF1x9y3(){ note_dtor("_ZN3ccc7FF1x9y3E", this);} // tgen
ccc::FF1x9y3 ::FF1x9y3(){ note_ctor("_ZN3ccc7FF1x9y3E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y3E, buf);
    ::ccc::FF1x9y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y3E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y3E);
    dp->::ccc::FF1x9y3::~FF1x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y3E(Test__ZN3ccc7FF1x9y3E, "_ZN3ccc7FF1x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y3C1Ev();
extern void _ZN3ccc7FF1x9y3D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y3E[] = {
  NSPAIR(_ZN3ccc7FF1x9y3C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y3E[];
extern void _ZN3ccc7FF1x9y33abcEv();
extern void _ZN3ccc7FF1x9y33pqrEv();
extern void _ZN3ccc7FF1x9y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y3E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y3E[] = {
  {&(_ZTVN3ccc7FF1x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y3E[];
static VTBL_ENTRY alt_thunk_names388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y3E = {  "_ZN3ccc7FF1x9y3E", // class name
  bases__ZN3ccc7FF1x9y3E, 2,
  &(vtc__ZN3ccc7FF1x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names388,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y4  : virtual ::ccc::EE1x9 {
  virtual void  pqr(); // _ZN3ccc7FF1x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF1x9y43abcEv
  virtual void  efg(); // _ZN3ccc7FF1x9y43efgEv
  ~FF1x9y4(); // tgen
  FF1x9y4(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y43pqrEv");}
void  ccc::FF1x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y43abcEv");}
void  ccc::FF1x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y43efgEv");}
ccc::FF1x9y4 ::~FF1x9y4(){ note_dtor("_ZN3ccc7FF1x9y4E", this);} // tgen
ccc::FF1x9y4 ::FF1x9y4(){ note_ctor("_ZN3ccc7FF1x9y4E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y4E, buf);
    ::ccc::FF1x9y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y4E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y4E);
    dp->::ccc::FF1x9y4::~FF1x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y4E(Test__ZN3ccc7FF1x9y4E, "_ZN3ccc7FF1x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y4C1Ev();
extern void _ZN3ccc7FF1x9y4D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y4E[] = {
  NSPAIR(_ZN3ccc7FF1x9y4C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y4E[];
extern void _ZN3ccc7FF1x9y43abcEv();
extern void _ZN3ccc7FF1x9y43pqrEv();
extern void _ZN3ccc7FF1x9y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y4E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y4E[] = {
  {&(_ZTVN3ccc7FF1x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y4E[];
static VTBL_ENTRY alt_thunk_names389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y4E = {  "_ZN3ccc7FF1x9y4E", // class name
  bases__ZN3ccc7FF1x9y4E, 2,
  &(vtc__ZN3ccc7FF1x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names389,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y5  : virtual ::ccc::EE1x9 {
  virtual void  pqr(); // _ZN3ccc7FF1x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF1x9y53efgEv
  virtual void  abc(); // _ZN3ccc7FF1x9y53abcEv
  ~FF1x9y5(); // tgen
  FF1x9y5(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y53pqrEv");}
void  ccc::FF1x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y53efgEv");}
void  ccc::FF1x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y53abcEv");}
ccc::FF1x9y5 ::~FF1x9y5(){ note_dtor("_ZN3ccc7FF1x9y5E", this);} // tgen
ccc::FF1x9y5 ::FF1x9y5(){ note_ctor("_ZN3ccc7FF1x9y5E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y5E, buf);
    ::ccc::FF1x9y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y5E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y5E);
    dp->::ccc::FF1x9y5::~FF1x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y5E(Test__ZN3ccc7FF1x9y5E, "_ZN3ccc7FF1x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y5C1Ev();
extern void _ZN3ccc7FF1x9y5D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y5E[] = {
  NSPAIR(_ZN3ccc7FF1x9y5C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y5E[];
extern void _ZN3ccc7FF1x9y53abcEv();
extern void _ZN3ccc7FF1x9y53pqrEv();
extern void _ZN3ccc7FF1x9y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y5E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y5E[] = {
  {&(_ZTVN3ccc7FF1x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y5E[];
static VTBL_ENTRY alt_thunk_names390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y5E = {  "_ZN3ccc7FF1x9y5E", // class name
  bases__ZN3ccc7FF1x9y5E, 2,
  &(vtc__ZN3ccc7FF1x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names390,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y6  : virtual ::ccc::EE1x9 {
  virtual void  abc(); // _ZN3ccc7FF1x9y63abcEv
  virtual void  efg(); // _ZN3ccc7FF1x9y63efgEv
  ~FF1x9y6(); // tgen
  FF1x9y6(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y63abcEv");}
void  ccc::FF1x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y63efgEv");}
ccc::FF1x9y6 ::~FF1x9y6(){ note_dtor("_ZN3ccc7FF1x9y6E", this);} // tgen
ccc::FF1x9y6 ::FF1x9y6(){ note_ctor("_ZN3ccc7FF1x9y6E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y6E, buf);
    ::ccc::FF1x9y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y6E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y6E);
    dp->::ccc::FF1x9y6::~FF1x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y6E(Test__ZN3ccc7FF1x9y6E, "_ZN3ccc7FF1x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y6C1Ev();
extern void _ZN3ccc7FF1x9y6D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y6E[] = {
  NSPAIR(_ZN3ccc7FF1x9y6C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y6E[];
extern void _ZN3ccc7FF1x9y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x9y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y6E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y6E[] = {
  {&(_ZTVN3ccc7FF1x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y6E[];
static VTBL_ENTRY alt_thunk_names391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y6E = {  "_ZN3ccc7FF1x9y6E", // class name
  bases__ZN3ccc7FF1x9y6E, 2,
  &(vtc__ZN3ccc7FF1x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names391,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y7  : virtual ::ccc::EE1x9 {
  virtual void  abc(); // _ZN3ccc7FF1x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y73pqrEv
  ~FF1x9y7(); // tgen
  FF1x9y7(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y73abcEv");}
void  ccc::FF1x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y73pqrEv");}
ccc::FF1x9y7 ::~FF1x9y7(){ note_dtor("_ZN3ccc7FF1x9y7E", this);} // tgen
ccc::FF1x9y7 ::FF1x9y7(){ note_ctor("_ZN3ccc7FF1x9y7E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y7E, buf);
    ::ccc::FF1x9y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y7E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y7E);
    dp->::ccc::FF1x9y7::~FF1x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y7E(Test__ZN3ccc7FF1x9y7E, "_ZN3ccc7FF1x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y7C1Ev();
extern void _ZN3ccc7FF1x9y7D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y7E[] = {
  NSPAIR(_ZN3ccc7FF1x9y7C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y7E[];
extern void _ZN3ccc7FF1x9y73abcEv();
extern void _ZN3ccc7FF1x9y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y7E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y7E[] = {
  {&(_ZTVN3ccc7FF1x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y7E[];
static VTBL_ENTRY alt_thunk_names392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y7E = {  "_ZN3ccc7FF1x9y7E", // class name
  bases__ZN3ccc7FF1x9y7E, 2,
  &(vtc__ZN3ccc7FF1x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names392,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y8  : virtual ::ccc::EE1x9 {
  virtual void  efg(); // _ZN3ccc7FF1x9y83efgEv
  virtual void  abc(); // _ZN3ccc7FF1x9y83abcEv
  ~FF1x9y8(); // tgen
  FF1x9y8(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y83efgEv");}
void  ccc::FF1x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF1x9y83abcEv");}
ccc::FF1x9y8 ::~FF1x9y8(){ note_dtor("_ZN3ccc7FF1x9y8E", this);} // tgen
ccc::FF1x9y8 ::FF1x9y8(){ note_ctor("_ZN3ccc7FF1x9y8E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y8E, buf);
    ::ccc::FF1x9y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y8E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y8E);
    dp->::ccc::FF1x9y8::~FF1x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y8E(Test__ZN3ccc7FF1x9y8E, "_ZN3ccc7FF1x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y8C1Ev();
extern void _ZN3ccc7FF1x9y8D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y8E[] = {
  NSPAIR(_ZN3ccc7FF1x9y8C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y8E[];
extern void _ZN3ccc7FF1x9y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF1x9y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y8E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y8E[] = {
  {&(_ZTVN3ccc7FF1x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y8E[];
static VTBL_ENTRY alt_thunk_names393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y8E = {  "_ZN3ccc7FF1x9y8E", // class name
  bases__ZN3ccc7FF1x9y8E, 2,
  &(vtc__ZN3ccc7FF1x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names393,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y9  : virtual ::ccc::EE1x9 {
  virtual void  efg(); // _ZN3ccc7FF1x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF1x9y93pqrEv
  ~FF1x9y9(); // tgen
  FF1x9y9(); // tgen
};
//SIG(1 _ZN3ccc7FF1x9y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF1x9y93efgEv");}
void  ccc::FF1x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF1x9y93pqrEv");}
ccc::FF1x9y9 ::~FF1x9y9(){ note_dtor("_ZN3ccc7FF1x9y9E", this);} // tgen
ccc::FF1x9y9 ::FF1x9y9(){ note_ctor("_ZN3ccc7FF1x9y9E", this);} // tgen
}
static void Test__ZN3ccc7FF1x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF1x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF1x9y9E, buf);
    ::ccc::FF1x9y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF1x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF1x9y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y9E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc7FF1x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF1x9y9E);
    dp->::ccc::FF1x9y9::~FF1x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF1x9y9E(Test__ZN3ccc7FF1x9y9E, "_ZN3ccc7FF1x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF1x9y9C1Ev();
extern void _ZN3ccc7FF1x9y9D1Ev();
Name_Map name_map__ZN3ccc7FF1x9y9E[] = {
  NSPAIR(_ZN3ccc7FF1x9y9C1Ev),
  NSPAIR(_ZN3ccc7FF1x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc7FF1x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7FF1x9y93pqrEv();
extern void _ZN3ccc7FF1x9y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF1x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF1x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF1x9y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF1x9y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF1x9y9E[] = {
  {&(_ZTVN3ccc7FF1x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF1x9y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_7FF1x9y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF1x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF1x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF1x9y9E[];
static VTBL_ENTRY alt_thunk_names394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF1x9y9E = {  "_ZN3ccc7FF1x9y9E", // class name
  bases__ZN3ccc7FF1x9y9E, 2,
  &(vtc__ZN3ccc7FF1x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF1x9y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF1x9y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF1x9y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF1x9y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names394,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y10  : virtual ::ccc::EE1x9 {
  virtual void  pqr(); // _ZN3ccc8FF1x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x9y103abcEv
  ~FF1x9y10(); // tgen
  FF1x9y10(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x9y103pqrEv");}
void  ccc::FF1x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x9y103abcEv");}
ccc::FF1x9y10 ::~FF1x9y10(){ note_dtor("_ZN3ccc8FF1x9y10E", this);} // tgen
ccc::FF1x9y10 ::FF1x9y10(){ note_ctor("_ZN3ccc8FF1x9y10E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y10E, buf);
    ::ccc::FF1x9y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y10E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y10E);
    dp->::ccc::FF1x9y10::~FF1x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y10E(Test__ZN3ccc8FF1x9y10E, "_ZN3ccc8FF1x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y10C1Ev();
extern void _ZN3ccc8FF1x9y10D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y10E[] = {
  NSPAIR(_ZN3ccc8FF1x9y10C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y10E[];
extern void _ZN3ccc8FF1x9y103abcEv();
extern void _ZN3ccc8FF1x9y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y10E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y10E[] = {
  {&(_ZTVN3ccc8FF1x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y10E[];
static VTBL_ENTRY alt_thunk_names395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y10E = {  "_ZN3ccc8FF1x9y10E", // class name
  bases__ZN3ccc8FF1x9y10E, 2,
  &(vtc__ZN3ccc8FF1x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names395,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y11  : virtual ::ccc::EE1x9 {
  virtual void  pqr(); // _ZN3ccc8FF1x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x9y113efgEv
  ~FF1x9y11(); // tgen
  FF1x9y11(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x9y113pqrEv");}
void  ccc::FF1x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x9y113efgEv");}
ccc::FF1x9y11 ::~FF1x9y11(){ note_dtor("_ZN3ccc8FF1x9y11E", this);} // tgen
ccc::FF1x9y11 ::FF1x9y11(){ note_ctor("_ZN3ccc8FF1x9y11E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y11E, buf);
    ::ccc::FF1x9y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y11E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y11E);
    dp->::ccc::FF1x9y11::~FF1x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y11E(Test__ZN3ccc8FF1x9y11E, "_ZN3ccc8FF1x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y11C1Ev();
extern void _ZN3ccc8FF1x9y11D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y11E[] = {
  NSPAIR(_ZN3ccc8FF1x9y11C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x9y113pqrEv();
extern void _ZN3ccc8FF1x9y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y11E[] = {
  {&(_ZTVN3ccc8FF1x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y11E[];
static VTBL_ENTRY alt_thunk_names396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y11E = {  "_ZN3ccc8FF1x9y11E", // class name
  bases__ZN3ccc8FF1x9y11E, 2,
  &(vtc__ZN3ccc8FF1x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names396,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y12  : virtual ::ccc::EE1x9 {
  virtual void  abc(); // _ZN3ccc8FF1x9y123abcEv
  ~FF1x9y12(); // tgen
  FF1x9y12(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x9y123abcEv");}
ccc::FF1x9y12 ::~FF1x9y12(){ note_dtor("_ZN3ccc8FF1x9y12E", this);} // tgen
ccc::FF1x9y12 ::FF1x9y12(){ note_ctor("_ZN3ccc8FF1x9y12E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y12E, buf);
    ::ccc::FF1x9y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y12E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y12E);
    dp->::ccc::FF1x9y12::~FF1x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y12E(Test__ZN3ccc8FF1x9y12E, "_ZN3ccc8FF1x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y12C1Ev();
extern void _ZN3ccc8FF1x9y12D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y12E[] = {
  NSPAIR(_ZN3ccc8FF1x9y12C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y12E[];
extern void _ZN3ccc8FF1x9y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y12E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y12E[] = {
  {&(_ZTVN3ccc8FF1x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y12E[];
static VTBL_ENTRY alt_thunk_names397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y12E = {  "_ZN3ccc8FF1x9y12E", // class name
  bases__ZN3ccc8FF1x9y12E, 2,
  &(vtc__ZN3ccc8FF1x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names397,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y13  : virtual ::ccc::EE1x9 {
  virtual void  efg(); // _ZN3ccc8FF1x9y133efgEv
  ~FF1x9y13(); // tgen
  FF1x9y13(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x9y133efgEv");}
ccc::FF1x9y13 ::~FF1x9y13(){ note_dtor("_ZN3ccc8FF1x9y13E", this);} // tgen
ccc::FF1x9y13 ::FF1x9y13(){ note_ctor("_ZN3ccc8FF1x9y13E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y13E, buf);
    ::ccc::FF1x9y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y13E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y13E);
    dp->::ccc::FF1x9y13::~FF1x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y13E(Test__ZN3ccc8FF1x9y13E, "_ZN3ccc8FF1x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y13C1Ev();
extern void _ZN3ccc8FF1x9y13D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y13E[] = {
  NSPAIR(_ZN3ccc8FF1x9y13C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x9y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y13E[] = {
  {&(_ZTVN3ccc8FF1x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y13E[];
static VTBL_ENTRY alt_thunk_names398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y13E = {  "_ZN3ccc8FF1x9y13E", // class name
  bases__ZN3ccc8FF1x9y13E, 2,
  &(vtc__ZN3ccc8FF1x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names398,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y14  : virtual ::ccc::EE1x9 {
  virtual void  pqr(); // _ZN3ccc8FF1x9y143pqrEv
  ~FF1x9y14(); // tgen
  FF1x9y14(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x9y143pqrEv");}
ccc::FF1x9y14 ::~FF1x9y14(){ note_dtor("_ZN3ccc8FF1x9y14E", this);} // tgen
ccc::FF1x9y14 ::FF1x9y14(){ note_ctor("_ZN3ccc8FF1x9y14E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y14E, buf);
    ::ccc::FF1x9y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y14E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y14E);
    dp->::ccc::FF1x9y14::~FF1x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y14E(Test__ZN3ccc8FF1x9y14E, "_ZN3ccc8FF1x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y14C1Ev();
extern void _ZN3ccc8FF1x9y14D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y14E[] = {
  NSPAIR(_ZN3ccc8FF1x9y14C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x9y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x9y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y14E[] = {
  {&(_ZTVN3ccc8FF1x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y14E[];
static VTBL_ENTRY alt_thunk_names399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y14E = {  "_ZN3ccc8FF1x9y14E", // class name
  bases__ZN3ccc8FF1x9y14E, 2,
  &(vtc__ZN3ccc8FF1x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names399,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x9y15  : virtual ::ccc::EE1x9 {
  ~FF1x9y15(); // tgen
  FF1x9y15(); // tgen
};
//SIG(1 _ZN3ccc8FF1x9y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2}}
}
namespace ccc { 
ccc::FF1x9y15 ::~FF1x9y15(){ note_dtor("_ZN3ccc8FF1x9y15E", this);} // tgen
ccc::FF1x9y15 ::FF1x9y15(){ note_ctor("_ZN3ccc8FF1x9y15E", this);} // tgen
}
static void Test__ZN3ccc8FF1x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x9y15E, buf);
    ::ccc::FF1x9y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x9y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y15E");
    check_base_class_offset(lv, (::ccc::EE1x9*), 0, "_ZN3ccc8FF1x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x9y15E);
    dp->::ccc::FF1x9y15::~FF1x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x9y15E(Test__ZN3ccc8FF1x9y15E, "_ZN3ccc8FF1x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x9y15C1Ev();
extern void _ZN3ccc8FF1x9y15D1Ev();
Name_Map name_map__ZN3ccc8FF1x9y15E[] = {
  NSPAIR(_ZN3ccc8FF1x9y15C1Ev),
  NSPAIR(_ZN3ccc8FF1x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc5EE1x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE1x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE1x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE1x9E[];
static Base_Class bases__ZN3ccc8FF1x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE1x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x9y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv)();
extern void _ZN3ccc5EE1x93pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv)();
extern void _ZN3ccc5EE1x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE1x9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x9y15E[] = {
  {&(_ZTVN3ccc8FF1x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x9y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE1x9E__NS_8FF1x9y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x9y15E[];
static VTBL_ENTRY alt_thunk_names400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE1x93efgEv,_ZTv0_n20_N3ccc5EE1x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE1x93pqrEv,_ZTv0_n16_N3ccc5EE1x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE1x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x9y15E = {  "_ZN3ccc8FF1x9y15E", // class name
  bases__ZN3ccc8FF1x9y15E, 2,
  &(vtc__ZN3ccc8FF1x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x9y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x9y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x9y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x9y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names400,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y0  : virtual ::ccc::EE1x10 {
  virtual void  abc(); // _ZN3ccc8FF1x10y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y03pqrEv
  ~FF1x10y0(); // tgen
  FF1x10y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y03abcEv");}
void  ccc::FF1x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y03efgEv");}
void  ccc::FF1x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y03pqrEv");}
ccc::FF1x10y0 ::~FF1x10y0(){ note_dtor("_ZN3ccc8FF1x10y0E", this);} // tgen
ccc::FF1x10y0 ::FF1x10y0(){ note_ctor("_ZN3ccc8FF1x10y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y0E, buf);
    ::ccc::FF1x10y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y0E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y0E);
    dp->::ccc::FF1x10y0::~FF1x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y0E(Test__ZN3ccc8FF1x10y0E, "_ZN3ccc8FF1x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y0C1Ev();
extern void _ZN3ccc8FF1x10y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y0E[] = {
  NSPAIR(_ZN3ccc8FF1x10y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y0E[];
extern void _ZN3ccc8FF1x10y03abcEv();
extern void _ZN3ccc8FF1x10y03pqrEv();
extern void _ZN3ccc8FF1x10y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y0E[] = {
  {&(_ZTVN3ccc8FF1x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y0E[];
static VTBL_ENTRY alt_thunk_names401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y0E = {  "_ZN3ccc8FF1x10y0E", // class name
  bases__ZN3ccc8FF1x10y0E, 2,
  &(vtc__ZN3ccc8FF1x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names401,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y1  : virtual ::ccc::EE1x10 {
  virtual void  abc(); // _ZN3ccc8FF1x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x10y13efgEv
  ~FF1x10y1(); // tgen
  FF1x10y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y13abcEv");}
void  ccc::FF1x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y13pqrEv");}
void  ccc::FF1x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y13efgEv");}
ccc::FF1x10y1 ::~FF1x10y1(){ note_dtor("_ZN3ccc8FF1x10y1E", this);} // tgen
ccc::FF1x10y1 ::FF1x10y1(){ note_ctor("_ZN3ccc8FF1x10y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y1E, buf);
    ::ccc::FF1x10y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y1E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y1E);
    dp->::ccc::FF1x10y1::~FF1x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y1E(Test__ZN3ccc8FF1x10y1E, "_ZN3ccc8FF1x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y1C1Ev();
extern void _ZN3ccc8FF1x10y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y1E[] = {
  NSPAIR(_ZN3ccc8FF1x10y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y1E[];
extern void _ZN3ccc8FF1x10y13abcEv();
extern void _ZN3ccc8FF1x10y13pqrEv();
extern void _ZN3ccc8FF1x10y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y1E[] = {
  {&(_ZTVN3ccc8FF1x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y1E[];
static VTBL_ENTRY alt_thunk_names402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y1E = {  "_ZN3ccc8FF1x10y1E", // class name
  bases__ZN3ccc8FF1x10y1E, 2,
  &(vtc__ZN3ccc8FF1x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names402,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y2  : virtual ::ccc::EE1x10 {
  virtual void  efg(); // _ZN3ccc8FF1x10y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y23pqrEv
  ~FF1x10y2(); // tgen
  FF1x10y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y23efgEv");}
void  ccc::FF1x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y23abcEv");}
void  ccc::FF1x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y23pqrEv");}
ccc::FF1x10y2 ::~FF1x10y2(){ note_dtor("_ZN3ccc8FF1x10y2E", this);} // tgen
ccc::FF1x10y2 ::FF1x10y2(){ note_ctor("_ZN3ccc8FF1x10y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y2E, buf);
    ::ccc::FF1x10y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y2E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y2E);
    dp->::ccc::FF1x10y2::~FF1x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y2E(Test__ZN3ccc8FF1x10y2E, "_ZN3ccc8FF1x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y2C1Ev();
extern void _ZN3ccc8FF1x10y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y2E[] = {
  NSPAIR(_ZN3ccc8FF1x10y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y2E[];
extern void _ZN3ccc8FF1x10y23abcEv();
extern void _ZN3ccc8FF1x10y23pqrEv();
extern void _ZN3ccc8FF1x10y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y2E[] = {
  {&(_ZTVN3ccc8FF1x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y2E[];
static VTBL_ENTRY alt_thunk_names403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y2E = {  "_ZN3ccc8FF1x10y2E", // class name
  bases__ZN3ccc8FF1x10y2E, 2,
  &(vtc__ZN3ccc8FF1x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y2E),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
namespace ccc { 
struct  FF1x10y3  : virtual ::ccc::EE1x10 {
  virtual void  efg(); // _ZN3ccc8FF1x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x10y33abcEv
  ~FF1x10y3(); // tgen
  FF1x10y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y33efgEv");}
void  ccc::FF1x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y33pqrEv");}
void  ccc::FF1x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y33abcEv");}
ccc::FF1x10y3 ::~FF1x10y3(){ note_dtor("_ZN3ccc8FF1x10y3E", this);} // tgen
ccc::FF1x10y3 ::FF1x10y3(){ note_ctor("_ZN3ccc8FF1x10y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y3E, buf);
    ::ccc::FF1x10y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y3E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y3E);
    dp->::ccc::FF1x10y3::~FF1x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y3E(Test__ZN3ccc8FF1x10y3E, "_ZN3ccc8FF1x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y3C1Ev();
extern void _ZN3ccc8FF1x10y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y3E[] = {
  NSPAIR(_ZN3ccc8FF1x10y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y3E[];
extern void _ZN3ccc8FF1x10y33abcEv();
extern void _ZN3ccc8FF1x10y33pqrEv();
extern void _ZN3ccc8FF1x10y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y3E[] = {
  {&(_ZTVN3ccc8FF1x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y3E[];
static VTBL_ENTRY alt_thunk_names404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y3E = {  "_ZN3ccc8FF1x10y3E", // class name
  bases__ZN3ccc8FF1x10y3E, 2,
  &(vtc__ZN3ccc8FF1x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names404,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y4  : virtual ::ccc::EE1x10 {
  virtual void  pqr(); // _ZN3ccc8FF1x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x10y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x10y43efgEv
  ~FF1x10y4(); // tgen
  FF1x10y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y43pqrEv");}
void  ccc::FF1x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y43abcEv");}
void  ccc::FF1x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y43efgEv");}
ccc::FF1x10y4 ::~FF1x10y4(){ note_dtor("_ZN3ccc8FF1x10y4E", this);} // tgen
ccc::FF1x10y4 ::FF1x10y4(){ note_ctor("_ZN3ccc8FF1x10y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y4E, buf);
    ::ccc::FF1x10y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y4E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y4E);
    dp->::ccc::FF1x10y4::~FF1x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y4E(Test__ZN3ccc8FF1x10y4E, "_ZN3ccc8FF1x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y4C1Ev();
extern void _ZN3ccc8FF1x10y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y4E[] = {
  NSPAIR(_ZN3ccc8FF1x10y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y4E[];
extern void _ZN3ccc8FF1x10y43abcEv();
extern void _ZN3ccc8FF1x10y43pqrEv();
extern void _ZN3ccc8FF1x10y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y4E[] = {
  {&(_ZTVN3ccc8FF1x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y4E[];
static VTBL_ENTRY alt_thunk_names405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y4E = {  "_ZN3ccc8FF1x10y4E", // class name
  bases__ZN3ccc8FF1x10y4E, 2,
  &(vtc__ZN3ccc8FF1x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names405,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y5  : virtual ::ccc::EE1x10 {
  virtual void  pqr(); // _ZN3ccc8FF1x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x10y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x10y53abcEv
  ~FF1x10y5(); // tgen
  FF1x10y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y53pqrEv");}
void  ccc::FF1x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y53efgEv");}
void  ccc::FF1x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y53abcEv");}
ccc::FF1x10y5 ::~FF1x10y5(){ note_dtor("_ZN3ccc8FF1x10y5E", this);} // tgen
ccc::FF1x10y5 ::FF1x10y5(){ note_ctor("_ZN3ccc8FF1x10y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y5E, buf);
    ::ccc::FF1x10y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y5E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y5E);
    dp->::ccc::FF1x10y5::~FF1x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y5E(Test__ZN3ccc8FF1x10y5E, "_ZN3ccc8FF1x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y5C1Ev();
extern void _ZN3ccc8FF1x10y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y5E[] = {
  NSPAIR(_ZN3ccc8FF1x10y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y5E[];
extern void _ZN3ccc8FF1x10y53abcEv();
extern void _ZN3ccc8FF1x10y53pqrEv();
extern void _ZN3ccc8FF1x10y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y5E[] = {
  {&(_ZTVN3ccc8FF1x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y5E[];
static VTBL_ENTRY alt_thunk_names406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y5E = {  "_ZN3ccc8FF1x10y5E", // class name
  bases__ZN3ccc8FF1x10y5E, 2,
  &(vtc__ZN3ccc8FF1x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names406,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y6  : virtual ::ccc::EE1x10 {
  virtual void  abc(); // _ZN3ccc8FF1x10y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x10y63efgEv
  ~FF1x10y6(); // tgen
  FF1x10y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y63abcEv");}
void  ccc::FF1x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y63efgEv");}
ccc::FF1x10y6 ::~FF1x10y6(){ note_dtor("_ZN3ccc8FF1x10y6E", this);} // tgen
ccc::FF1x10y6 ::FF1x10y6(){ note_ctor("_ZN3ccc8FF1x10y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y6E, buf);
    ::ccc::FF1x10y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y6E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y6E);
    dp->::ccc::FF1x10y6::~FF1x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y6E(Test__ZN3ccc8FF1x10y6E, "_ZN3ccc8FF1x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y6C1Ev();
extern void _ZN3ccc8FF1x10y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y6E[] = {
  NSPAIR(_ZN3ccc8FF1x10y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y6E[];
extern void _ZN3ccc8FF1x10y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x10y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y6E[] = {
  {&(_ZTVN3ccc8FF1x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y6E[];
static VTBL_ENTRY alt_thunk_names407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y6E = {  "_ZN3ccc8FF1x10y6E", // class name
  bases__ZN3ccc8FF1x10y6E, 2,
  &(vtc__ZN3ccc8FF1x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names407,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y7  : virtual ::ccc::EE1x10 {
  virtual void  abc(); // _ZN3ccc8FF1x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y73pqrEv
  ~FF1x10y7(); // tgen
  FF1x10y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y73abcEv");}
void  ccc::FF1x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y73pqrEv");}
ccc::FF1x10y7 ::~FF1x10y7(){ note_dtor("_ZN3ccc8FF1x10y7E", this);} // tgen
ccc::FF1x10y7 ::FF1x10y7(){ note_ctor("_ZN3ccc8FF1x10y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y7E, buf);
    ::ccc::FF1x10y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y7E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y7E);
    dp->::ccc::FF1x10y7::~FF1x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y7E(Test__ZN3ccc8FF1x10y7E, "_ZN3ccc8FF1x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y7C1Ev();
extern void _ZN3ccc8FF1x10y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y7E[] = {
  NSPAIR(_ZN3ccc8FF1x10y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y7E[];
extern void _ZN3ccc8FF1x10y73abcEv();
extern void _ZN3ccc8FF1x10y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y7E[] = {
  {&(_ZTVN3ccc8FF1x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y7E[];
static VTBL_ENTRY alt_thunk_names408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y7E = {  "_ZN3ccc8FF1x10y7E", // class name
  bases__ZN3ccc8FF1x10y7E, 2,
  &(vtc__ZN3ccc8FF1x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names408,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y8  : virtual ::ccc::EE1x10 {
  virtual void  efg(); // _ZN3ccc8FF1x10y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x10y83abcEv
  ~FF1x10y8(); // tgen
  FF1x10y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y83efgEv");}
void  ccc::FF1x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x10y83abcEv");}
ccc::FF1x10y8 ::~FF1x10y8(){ note_dtor("_ZN3ccc8FF1x10y8E", this);} // tgen
ccc::FF1x10y8 ::FF1x10y8(){ note_ctor("_ZN3ccc8FF1x10y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y8E, buf);
    ::ccc::FF1x10y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y8E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y8E);
    dp->::ccc::FF1x10y8::~FF1x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y8E(Test__ZN3ccc8FF1x10y8E, "_ZN3ccc8FF1x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y8C1Ev();
extern void _ZN3ccc8FF1x10y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y8E[] = {
  NSPAIR(_ZN3ccc8FF1x10y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y8E[];
extern void _ZN3ccc8FF1x10y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x10y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y8E[] = {
  {&(_ZTVN3ccc8FF1x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y8E[];
static VTBL_ENTRY alt_thunk_names409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y8E = {  "_ZN3ccc8FF1x10y8E", // class name
  bases__ZN3ccc8FF1x10y8E, 2,
  &(vtc__ZN3ccc8FF1x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names409,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y9  : virtual ::ccc::EE1x10 {
  virtual void  efg(); // _ZN3ccc8FF1x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x10y93pqrEv
  ~FF1x10y9(); // tgen
  FF1x10y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x10y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x10y93efgEv");}
void  ccc::FF1x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x10y93pqrEv");}
ccc::FF1x10y9 ::~FF1x10y9(){ note_dtor("_ZN3ccc8FF1x10y9E", this);} // tgen
ccc::FF1x10y9 ::FF1x10y9(){ note_ctor("_ZN3ccc8FF1x10y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x10y9E, buf);
    ::ccc::FF1x10y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x10y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y9E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc8FF1x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x10y9E);
    dp->::ccc::FF1x10y9::~FF1x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x10y9E(Test__ZN3ccc8FF1x10y9E, "_ZN3ccc8FF1x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x10y9C1Ev();
extern void _ZN3ccc8FF1x10y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x10y9E[] = {
  NSPAIR(_ZN3ccc8FF1x10y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc8FF1x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x10y93pqrEv();
extern void _ZN3ccc8FF1x10y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x10y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x10y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x10y9E[] = {
  {&(_ZTVN3ccc8FF1x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x10y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_8FF1x10y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x10y9E[];
static VTBL_ENTRY alt_thunk_names410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x10y9E = {  "_ZN3ccc8FF1x10y9E", // class name
  bases__ZN3ccc8FF1x10y9E, 2,
  &(vtc__ZN3ccc8FF1x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x10y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x10y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x10y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x10y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names410,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y10  : virtual ::ccc::EE1x10 {
  virtual void  pqr(); // _ZN3ccc9FF1x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x10y103abcEv
  ~FF1x10y10(); // tgen
  FF1x10y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x10y103pqrEv");}
void  ccc::FF1x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x10y103abcEv");}
ccc::FF1x10y10 ::~FF1x10y10(){ note_dtor("_ZN3ccc9FF1x10y10E", this);} // tgen
ccc::FF1x10y10 ::FF1x10y10(){ note_ctor("_ZN3ccc9FF1x10y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y10E, buf);
    ::ccc::FF1x10y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y10E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y10E);
    dp->::ccc::FF1x10y10::~FF1x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y10E(Test__ZN3ccc9FF1x10y10E, "_ZN3ccc9FF1x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y10C1Ev();
extern void _ZN3ccc9FF1x10y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y10E[] = {
  NSPAIR(_ZN3ccc9FF1x10y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y10E[];
extern void _ZN3ccc9FF1x10y103abcEv();
extern void _ZN3ccc9FF1x10y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y10E[] = {
  {&(_ZTVN3ccc9FF1x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y10E[];
static VTBL_ENTRY alt_thunk_names411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y10E = {  "_ZN3ccc9FF1x10y10E", // class name
  bases__ZN3ccc9FF1x10y10E, 2,
  &(vtc__ZN3ccc9FF1x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names411,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y11  : virtual ::ccc::EE1x10 {
  virtual void  pqr(); // _ZN3ccc9FF1x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x10y113efgEv
  ~FF1x10y11(); // tgen
  FF1x10y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x10y113pqrEv");}
void  ccc::FF1x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x10y113efgEv");}
ccc::FF1x10y11 ::~FF1x10y11(){ note_dtor("_ZN3ccc9FF1x10y11E", this);} // tgen
ccc::FF1x10y11 ::FF1x10y11(){ note_ctor("_ZN3ccc9FF1x10y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y11E, buf);
    ::ccc::FF1x10y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y11E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y11E);
    dp->::ccc::FF1x10y11::~FF1x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y11E(Test__ZN3ccc9FF1x10y11E, "_ZN3ccc9FF1x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y11C1Ev();
extern void _ZN3ccc9FF1x10y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y11E[] = {
  NSPAIR(_ZN3ccc9FF1x10y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF1x10y113pqrEv();
extern void _ZN3ccc9FF1x10y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y11E[] = {
  {&(_ZTVN3ccc9FF1x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y11E[];
static VTBL_ENTRY alt_thunk_names412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y11E = {  "_ZN3ccc9FF1x10y11E", // class name
  bases__ZN3ccc9FF1x10y11E, 2,
  &(vtc__ZN3ccc9FF1x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names412,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y12  : virtual ::ccc::EE1x10 {
  virtual void  abc(); // _ZN3ccc9FF1x10y123abcEv
  ~FF1x10y12(); // tgen
  FF1x10y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x10y123abcEv");}
ccc::FF1x10y12 ::~FF1x10y12(){ note_dtor("_ZN3ccc9FF1x10y12E", this);} // tgen
ccc::FF1x10y12 ::FF1x10y12(){ note_ctor("_ZN3ccc9FF1x10y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y12E, buf);
    ::ccc::FF1x10y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y12E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y12E);
    dp->::ccc::FF1x10y12::~FF1x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y12E(Test__ZN3ccc9FF1x10y12E, "_ZN3ccc9FF1x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y12C1Ev();
extern void _ZN3ccc9FF1x10y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y12E[] = {
  NSPAIR(_ZN3ccc9FF1x10y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y12E[];
extern void _ZN3ccc9FF1x10y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y12E[] = {
  {&(_ZTVN3ccc9FF1x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y12E[];
static VTBL_ENTRY alt_thunk_names413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y12E = {  "_ZN3ccc9FF1x10y12E", // class name
  bases__ZN3ccc9FF1x10y12E, 2,
  &(vtc__ZN3ccc9FF1x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names413,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y13  : virtual ::ccc::EE1x10 {
  virtual void  efg(); // _ZN3ccc9FF1x10y133efgEv
  ~FF1x10y13(); // tgen
  FF1x10y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x10y133efgEv");}
ccc::FF1x10y13 ::~FF1x10y13(){ note_dtor("_ZN3ccc9FF1x10y13E", this);} // tgen
ccc::FF1x10y13 ::FF1x10y13(){ note_ctor("_ZN3ccc9FF1x10y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y13E, buf);
    ::ccc::FF1x10y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y13E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y13E);
    dp->::ccc::FF1x10y13::~FF1x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y13E(Test__ZN3ccc9FF1x10y13E, "_ZN3ccc9FF1x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y13C1Ev();
extern void _ZN3ccc9FF1x10y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y13E[] = {
  NSPAIR(_ZN3ccc9FF1x10y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF1x10y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y13E[] = {
  {&(_ZTVN3ccc9FF1x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y13E[];
static VTBL_ENTRY alt_thunk_names414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y13E = {  "_ZN3ccc9FF1x10y13E", // class name
  bases__ZN3ccc9FF1x10y13E, 2,
  &(vtc__ZN3ccc9FF1x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names414,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y14  : virtual ::ccc::EE1x10 {
  virtual void  pqr(); // _ZN3ccc9FF1x10y143pqrEv
  ~FF1x10y14(); // tgen
  FF1x10y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x10y143pqrEv");}
ccc::FF1x10y14 ::~FF1x10y14(){ note_dtor("_ZN3ccc9FF1x10y14E", this);} // tgen
ccc::FF1x10y14 ::FF1x10y14(){ note_ctor("_ZN3ccc9FF1x10y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y14E, buf);
    ::ccc::FF1x10y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y14E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y14E);
    dp->::ccc::FF1x10y14::~FF1x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y14E(Test__ZN3ccc9FF1x10y14E, "_ZN3ccc9FF1x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y14C1Ev();
extern void _ZN3ccc9FF1x10y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y14E[] = {
  NSPAIR(_ZN3ccc9FF1x10y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF1x10y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y14E[] = {
  {&(_ZTVN3ccc9FF1x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y14E[];
static VTBL_ENTRY alt_thunk_names415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y14E = {  "_ZN3ccc9FF1x10y14E", // class name
  bases__ZN3ccc9FF1x10y14E, 2,
  &(vtc__ZN3ccc9FF1x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names415,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x10y15  : virtual ::ccc::EE1x10 {
  ~FF1x10y15(); // tgen
  FF1x10y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x10y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2}}
}
namespace ccc { 
ccc::FF1x10y15 ::~FF1x10y15(){ note_dtor("_ZN3ccc9FF1x10y15E", this);} // tgen
ccc::FF1x10y15 ::FF1x10y15(){ note_ctor("_ZN3ccc9FF1x10y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x10y15E, buf);
    ::ccc::FF1x10y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x10y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y15E");
    check_base_class_offset(lv, (::ccc::EE1x10*), 0, "_ZN3ccc9FF1x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x10y15E);
    dp->::ccc::FF1x10y15::~FF1x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x10y15E(Test__ZN3ccc9FF1x10y15E, "_ZN3ccc9FF1x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x10y15C1Ev();
extern void _ZN3ccc9FF1x10y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x10y15E[] = {
  NSPAIR(_ZN3ccc9FF1x10y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x10E[];
static Base_Class bases__ZN3ccc9FF1x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x10y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv)();
extern void _ZN3ccc6EE1x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv)();
extern void _ZN3ccc6EE1x103pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x10y15E[] = {
  {&(_ZTVN3ccc9FF1x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x10y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x10E__NS_9FF1x10y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x10y15E[];
static VTBL_ENTRY alt_thunk_names416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x103pqrEv,_ZTv0_n16_N3ccc6EE1x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x103abcEv,_ZTv0_n12_N3ccc6EE1x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x10y15E = {  "_ZN3ccc9FF1x10y15E", // class name
  bases__ZN3ccc9FF1x10y15E, 2,
  &(vtc__ZN3ccc9FF1x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x10y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x10y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x10y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x10y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names416,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y0  : virtual ::ccc::EE1x11 {
  virtual void  abc(); // _ZN3ccc8FF1x11y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y03pqrEv
  ~FF1x11y0(); // tgen
  FF1x11y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y03abcEv");}
void  ccc::FF1x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y03efgEv");}
void  ccc::FF1x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y03pqrEv");}
ccc::FF1x11y0 ::~FF1x11y0(){ note_dtor("_ZN3ccc8FF1x11y0E", this);} // tgen
ccc::FF1x11y0 ::FF1x11y0(){ note_ctor("_ZN3ccc8FF1x11y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y0E, buf);
    ::ccc::FF1x11y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y0E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y0E);
    dp->::ccc::FF1x11y0::~FF1x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y0E(Test__ZN3ccc8FF1x11y0E, "_ZN3ccc8FF1x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y0C1Ev();
extern void _ZN3ccc8FF1x11y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y0E[] = {
  NSPAIR(_ZN3ccc8FF1x11y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y0E[];
extern void _ZN3ccc8FF1x11y03abcEv();
extern void _ZN3ccc8FF1x11y03pqrEv();
extern void _ZN3ccc8FF1x11y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y0E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y0E[] = {
  {&(_ZTVN3ccc8FF1x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y0E[];
static VTBL_ENTRY alt_thunk_names417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y0E = {  "_ZN3ccc8FF1x11y0E", // class name
  bases__ZN3ccc8FF1x11y0E, 2,
  &(vtc__ZN3ccc8FF1x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names417,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y1  : virtual ::ccc::EE1x11 {
  virtual void  abc(); // _ZN3ccc8FF1x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x11y13efgEv
  ~FF1x11y1(); // tgen
  FF1x11y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y13abcEv");}
void  ccc::FF1x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y13pqrEv");}
void  ccc::FF1x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y13efgEv");}
ccc::FF1x11y1 ::~FF1x11y1(){ note_dtor("_ZN3ccc8FF1x11y1E", this);} // tgen
ccc::FF1x11y1 ::FF1x11y1(){ note_ctor("_ZN3ccc8FF1x11y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y1E, buf);
    ::ccc::FF1x11y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y1E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y1E);
    dp->::ccc::FF1x11y1::~FF1x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y1E(Test__ZN3ccc8FF1x11y1E, "_ZN3ccc8FF1x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y1C1Ev();
extern void _ZN3ccc8FF1x11y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y1E[] = {
  NSPAIR(_ZN3ccc8FF1x11y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y1E[];
extern void _ZN3ccc8FF1x11y13abcEv();
extern void _ZN3ccc8FF1x11y13pqrEv();
extern void _ZN3ccc8FF1x11y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y1E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y1E[] = {
  {&(_ZTVN3ccc8FF1x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y1E[];
static VTBL_ENTRY alt_thunk_names418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y1E = {  "_ZN3ccc8FF1x11y1E", // class name
  bases__ZN3ccc8FF1x11y1E, 2,
  &(vtc__ZN3ccc8FF1x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names418,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y2  : virtual ::ccc::EE1x11 {
  virtual void  efg(); // _ZN3ccc8FF1x11y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y23pqrEv
  ~FF1x11y2(); // tgen
  FF1x11y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y23efgEv");}
void  ccc::FF1x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y23abcEv");}
void  ccc::FF1x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y23pqrEv");}
ccc::FF1x11y2 ::~FF1x11y2(){ note_dtor("_ZN3ccc8FF1x11y2E", this);} // tgen
ccc::FF1x11y2 ::FF1x11y2(){ note_ctor("_ZN3ccc8FF1x11y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y2E, buf);
    ::ccc::FF1x11y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y2E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y2E);
    dp->::ccc::FF1x11y2::~FF1x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y2E(Test__ZN3ccc8FF1x11y2E, "_ZN3ccc8FF1x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y2C1Ev();
extern void _ZN3ccc8FF1x11y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y2E[] = {
  NSPAIR(_ZN3ccc8FF1x11y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y2E[];
extern void _ZN3ccc8FF1x11y23abcEv();
extern void _ZN3ccc8FF1x11y23pqrEv();
extern void _ZN3ccc8FF1x11y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y2E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y2E[] = {
  {&(_ZTVN3ccc8FF1x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y2E[];
static VTBL_ENTRY alt_thunk_names419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y2E = {  "_ZN3ccc8FF1x11y2E", // class name
  bases__ZN3ccc8FF1x11y2E, 2,
  &(vtc__ZN3ccc8FF1x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names419,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y3  : virtual ::ccc::EE1x11 {
  virtual void  efg(); // _ZN3ccc8FF1x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x11y33abcEv
  ~FF1x11y3(); // tgen
  FF1x11y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y33efgEv");}
void  ccc::FF1x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y33pqrEv");}
void  ccc::FF1x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y33abcEv");}
ccc::FF1x11y3 ::~FF1x11y3(){ note_dtor("_ZN3ccc8FF1x11y3E", this);} // tgen
ccc::FF1x11y3 ::FF1x11y3(){ note_ctor("_ZN3ccc8FF1x11y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y3E, buf);
    ::ccc::FF1x11y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y3E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y3E);
    dp->::ccc::FF1x11y3::~FF1x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y3E(Test__ZN3ccc8FF1x11y3E, "_ZN3ccc8FF1x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y3C1Ev();
extern void _ZN3ccc8FF1x11y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y3E[] = {
  NSPAIR(_ZN3ccc8FF1x11y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y3E[];
extern void _ZN3ccc8FF1x11y33abcEv();
extern void _ZN3ccc8FF1x11y33pqrEv();
extern void _ZN3ccc8FF1x11y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y3E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y3E[] = {
  {&(_ZTVN3ccc8FF1x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y3E[];
static VTBL_ENTRY alt_thunk_names420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y3E = {  "_ZN3ccc8FF1x11y3E", // class name
  bases__ZN3ccc8FF1x11y3E, 2,
  &(vtc__ZN3ccc8FF1x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names420,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y4  : virtual ::ccc::EE1x11 {
  virtual void  pqr(); // _ZN3ccc8FF1x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x11y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x11y43efgEv
  ~FF1x11y4(); // tgen
  FF1x11y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y43pqrEv");}
void  ccc::FF1x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y43abcEv");}
void  ccc::FF1x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y43efgEv");}
ccc::FF1x11y4 ::~FF1x11y4(){ note_dtor("_ZN3ccc8FF1x11y4E", this);} // tgen
ccc::FF1x11y4 ::FF1x11y4(){ note_ctor("_ZN3ccc8FF1x11y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y4E, buf);
    ::ccc::FF1x11y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y4E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y4E);
    dp->::ccc::FF1x11y4::~FF1x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y4E(Test__ZN3ccc8FF1x11y4E, "_ZN3ccc8FF1x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y4C1Ev();
extern void _ZN3ccc8FF1x11y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y4E[] = {
  NSPAIR(_ZN3ccc8FF1x11y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y4E[];
extern void _ZN3ccc8FF1x11y43abcEv();
extern void _ZN3ccc8FF1x11y43pqrEv();
extern void _ZN3ccc8FF1x11y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y4E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y4E[] = {
  {&(_ZTVN3ccc8FF1x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y4E[];
static VTBL_ENTRY alt_thunk_names421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y4E = {  "_ZN3ccc8FF1x11y4E", // class name
  bases__ZN3ccc8FF1x11y4E, 2,
  &(vtc__ZN3ccc8FF1x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y4E),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
namespace ccc { 
struct  FF1x11y5  : virtual ::ccc::EE1x11 {
  virtual void  pqr(); // _ZN3ccc8FF1x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x11y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x11y53abcEv
  ~FF1x11y5(); // tgen
  FF1x11y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y53pqrEv");}
void  ccc::FF1x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y53efgEv");}
void  ccc::FF1x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y53abcEv");}
ccc::FF1x11y5 ::~FF1x11y5(){ note_dtor("_ZN3ccc8FF1x11y5E", this);} // tgen
ccc::FF1x11y5 ::FF1x11y5(){ note_ctor("_ZN3ccc8FF1x11y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y5E, buf);
    ::ccc::FF1x11y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y5E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y5E);
    dp->::ccc::FF1x11y5::~FF1x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y5E(Test__ZN3ccc8FF1x11y5E, "_ZN3ccc8FF1x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y5C1Ev();
extern void _ZN3ccc8FF1x11y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y5E[] = {
  NSPAIR(_ZN3ccc8FF1x11y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y5E[];
extern void _ZN3ccc8FF1x11y53abcEv();
extern void _ZN3ccc8FF1x11y53pqrEv();
extern void _ZN3ccc8FF1x11y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y5E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y5E[] = {
  {&(_ZTVN3ccc8FF1x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y5E[];
static VTBL_ENTRY alt_thunk_names422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y5E = {  "_ZN3ccc8FF1x11y5E", // class name
  bases__ZN3ccc8FF1x11y5E, 2,
  &(vtc__ZN3ccc8FF1x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names422,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y6  : virtual ::ccc::EE1x11 {
  virtual void  abc(); // _ZN3ccc8FF1x11y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x11y63efgEv
  ~FF1x11y6(); // tgen
  FF1x11y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y63abcEv");}
void  ccc::FF1x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y63efgEv");}
ccc::FF1x11y6 ::~FF1x11y6(){ note_dtor("_ZN3ccc8FF1x11y6E", this);} // tgen
ccc::FF1x11y6 ::FF1x11y6(){ note_ctor("_ZN3ccc8FF1x11y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y6E, buf);
    ::ccc::FF1x11y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y6E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y6E);
    dp->::ccc::FF1x11y6::~FF1x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y6E(Test__ZN3ccc8FF1x11y6E, "_ZN3ccc8FF1x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y6C1Ev();
extern void _ZN3ccc8FF1x11y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y6E[] = {
  NSPAIR(_ZN3ccc8FF1x11y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y6E[];
extern void _ZN3ccc8FF1x11y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x11y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y6E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y6E[] = {
  {&(_ZTVN3ccc8FF1x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y6E[];
static VTBL_ENTRY alt_thunk_names423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y6E = {  "_ZN3ccc8FF1x11y6E", // class name
  bases__ZN3ccc8FF1x11y6E, 2,
  &(vtc__ZN3ccc8FF1x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names423,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y7  : virtual ::ccc::EE1x11 {
  virtual void  abc(); // _ZN3ccc8FF1x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y73pqrEv
  ~FF1x11y7(); // tgen
  FF1x11y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y73abcEv");}
void  ccc::FF1x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y73pqrEv");}
ccc::FF1x11y7 ::~FF1x11y7(){ note_dtor("_ZN3ccc8FF1x11y7E", this);} // tgen
ccc::FF1x11y7 ::FF1x11y7(){ note_ctor("_ZN3ccc8FF1x11y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y7E, buf);
    ::ccc::FF1x11y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y7E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y7E);
    dp->::ccc::FF1x11y7::~FF1x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y7E(Test__ZN3ccc8FF1x11y7E, "_ZN3ccc8FF1x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y7C1Ev();
extern void _ZN3ccc8FF1x11y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y7E[] = {
  NSPAIR(_ZN3ccc8FF1x11y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y7E[];
extern void _ZN3ccc8FF1x11y73abcEv();
extern void _ZN3ccc8FF1x11y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y7E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y7E[] = {
  {&(_ZTVN3ccc8FF1x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y7E[];
static VTBL_ENTRY alt_thunk_names424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y7E = {  "_ZN3ccc8FF1x11y7E", // class name
  bases__ZN3ccc8FF1x11y7E, 2,
  &(vtc__ZN3ccc8FF1x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names424,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y8  : virtual ::ccc::EE1x11 {
  virtual void  efg(); // _ZN3ccc8FF1x11y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x11y83abcEv
  ~FF1x11y8(); // tgen
  FF1x11y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y83efgEv");}
void  ccc::FF1x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x11y83abcEv");}
ccc::FF1x11y8 ::~FF1x11y8(){ note_dtor("_ZN3ccc8FF1x11y8E", this);} // tgen
ccc::FF1x11y8 ::FF1x11y8(){ note_ctor("_ZN3ccc8FF1x11y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y8E, buf);
    ::ccc::FF1x11y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y8E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y8E);
    dp->::ccc::FF1x11y8::~FF1x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y8E(Test__ZN3ccc8FF1x11y8E, "_ZN3ccc8FF1x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y8C1Ev();
extern void _ZN3ccc8FF1x11y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y8E[] = {
  NSPAIR(_ZN3ccc8FF1x11y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y8E[];
extern void _ZN3ccc8FF1x11y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x11y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y8E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y8E[] = {
  {&(_ZTVN3ccc8FF1x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y8E[];
static VTBL_ENTRY alt_thunk_names425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y8E = {  "_ZN3ccc8FF1x11y8E", // class name
  bases__ZN3ccc8FF1x11y8E, 2,
  &(vtc__ZN3ccc8FF1x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names425,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y9  : virtual ::ccc::EE1x11 {
  virtual void  efg(); // _ZN3ccc8FF1x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x11y93pqrEv
  ~FF1x11y9(); // tgen
  FF1x11y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x11y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x11y93efgEv");}
void  ccc::FF1x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x11y93pqrEv");}
ccc::FF1x11y9 ::~FF1x11y9(){ note_dtor("_ZN3ccc8FF1x11y9E", this);} // tgen
ccc::FF1x11y9 ::FF1x11y9(){ note_ctor("_ZN3ccc8FF1x11y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x11y9E, buf);
    ::ccc::FF1x11y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x11y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y9E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc8FF1x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x11y9E);
    dp->::ccc::FF1x11y9::~FF1x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x11y9E(Test__ZN3ccc8FF1x11y9E, "_ZN3ccc8FF1x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x11y9C1Ev();
extern void _ZN3ccc8FF1x11y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x11y9E[] = {
  NSPAIR(_ZN3ccc8FF1x11y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc8FF1x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x11y93pqrEv();
extern void _ZN3ccc8FF1x11y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x11y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x11y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x11y9E[] = {
  {&(_ZTVN3ccc8FF1x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x11y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_8FF1x11y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x11y9E[];
static VTBL_ENTRY alt_thunk_names426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x11y9E = {  "_ZN3ccc8FF1x11y9E", // class name
  bases__ZN3ccc8FF1x11y9E, 2,
  &(vtc__ZN3ccc8FF1x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x11y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x11y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x11y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x11y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names426,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y10  : virtual ::ccc::EE1x11 {
  virtual void  pqr(); // _ZN3ccc9FF1x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x11y103abcEv
  ~FF1x11y10(); // tgen
  FF1x11y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x11y103pqrEv");}
void  ccc::FF1x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x11y103abcEv");}
ccc::FF1x11y10 ::~FF1x11y10(){ note_dtor("_ZN3ccc9FF1x11y10E", this);} // tgen
ccc::FF1x11y10 ::FF1x11y10(){ note_ctor("_ZN3ccc9FF1x11y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y10E, buf);
    ::ccc::FF1x11y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y10E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y10E);
    dp->::ccc::FF1x11y10::~FF1x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y10E(Test__ZN3ccc9FF1x11y10E, "_ZN3ccc9FF1x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y10C1Ev();
extern void _ZN3ccc9FF1x11y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y10E[] = {
  NSPAIR(_ZN3ccc9FF1x11y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y10E[];
extern void _ZN3ccc9FF1x11y103abcEv();
extern void _ZN3ccc9FF1x11y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y10E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y10E[] = {
  {&(_ZTVN3ccc9FF1x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y10E[];
static VTBL_ENTRY alt_thunk_names427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y10E = {  "_ZN3ccc9FF1x11y10E", // class name
  bases__ZN3ccc9FF1x11y10E, 2,
  &(vtc__ZN3ccc9FF1x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names427,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y11  : virtual ::ccc::EE1x11 {
  virtual void  pqr(); // _ZN3ccc9FF1x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x11y113efgEv
  ~FF1x11y11(); // tgen
  FF1x11y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x11y113pqrEv");}
void  ccc::FF1x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x11y113efgEv");}
ccc::FF1x11y11 ::~FF1x11y11(){ note_dtor("_ZN3ccc9FF1x11y11E", this);} // tgen
ccc::FF1x11y11 ::FF1x11y11(){ note_ctor("_ZN3ccc9FF1x11y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y11E, buf);
    ::ccc::FF1x11y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y11E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y11E);
    dp->::ccc::FF1x11y11::~FF1x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y11E(Test__ZN3ccc9FF1x11y11E, "_ZN3ccc9FF1x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y11C1Ev();
extern void _ZN3ccc9FF1x11y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y11E[] = {
  NSPAIR(_ZN3ccc9FF1x11y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x11y113pqrEv();
extern void _ZN3ccc9FF1x11y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y11E[] = {
  {&(_ZTVN3ccc9FF1x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y11E[];
static VTBL_ENTRY alt_thunk_names428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y11E = {  "_ZN3ccc9FF1x11y11E", // class name
  bases__ZN3ccc9FF1x11y11E, 2,
  &(vtc__ZN3ccc9FF1x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names428,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y12  : virtual ::ccc::EE1x11 {
  virtual void  abc(); // _ZN3ccc9FF1x11y123abcEv
  ~FF1x11y12(); // tgen
  FF1x11y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF1x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x11y123abcEv");}
ccc::FF1x11y12 ::~FF1x11y12(){ note_dtor("_ZN3ccc9FF1x11y12E", this);} // tgen
ccc::FF1x11y12 ::FF1x11y12(){ note_ctor("_ZN3ccc9FF1x11y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y12E, buf);
    ::ccc::FF1x11y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y12E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y12E);
    dp->::ccc::FF1x11y12::~FF1x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y12E(Test__ZN3ccc9FF1x11y12E, "_ZN3ccc9FF1x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y12C1Ev();
extern void _ZN3ccc9FF1x11y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y12E[] = {
  NSPAIR(_ZN3ccc9FF1x11y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y12E[];
extern void _ZN3ccc9FF1x11y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y12E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y12E[] = {
  {&(_ZTVN3ccc9FF1x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y12E[];
static VTBL_ENTRY alt_thunk_names429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y12E = {  "_ZN3ccc9FF1x11y12E", // class name
  bases__ZN3ccc9FF1x11y12E, 2,
  &(vtc__ZN3ccc9FF1x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names429,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y13  : virtual ::ccc::EE1x11 {
  virtual void  efg(); // _ZN3ccc9FF1x11y133efgEv
  ~FF1x11y13(); // tgen
  FF1x11y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF1x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x11y133efgEv");}
ccc::FF1x11y13 ::~FF1x11y13(){ note_dtor("_ZN3ccc9FF1x11y13E", this);} // tgen
ccc::FF1x11y13 ::FF1x11y13(){ note_ctor("_ZN3ccc9FF1x11y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y13E, buf);
    ::ccc::FF1x11y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y13E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y13E);
    dp->::ccc::FF1x11y13::~FF1x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y13E(Test__ZN3ccc9FF1x11y13E, "_ZN3ccc9FF1x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y13C1Ev();
extern void _ZN3ccc9FF1x11y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y13E[] = {
  NSPAIR(_ZN3ccc9FF1x11y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF1x11y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y13E[] = {
  {&(_ZTVN3ccc9FF1x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y13E[];
static VTBL_ENTRY alt_thunk_names430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y13E = {  "_ZN3ccc9FF1x11y13E", // class name
  bases__ZN3ccc9FF1x11y13E, 2,
  &(vtc__ZN3ccc9FF1x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names430,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y14  : virtual ::ccc::EE1x11 {
  virtual void  pqr(); // _ZN3ccc9FF1x11y143pqrEv
  ~FF1x11y14(); // tgen
  FF1x11y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF1x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x11y143pqrEv");}
ccc::FF1x11y14 ::~FF1x11y14(){ note_dtor("_ZN3ccc9FF1x11y14E", this);} // tgen
ccc::FF1x11y14 ::FF1x11y14(){ note_ctor("_ZN3ccc9FF1x11y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y14E, buf);
    ::ccc::FF1x11y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y14E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y14E);
    dp->::ccc::FF1x11y14::~FF1x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y14E(Test__ZN3ccc9FF1x11y14E, "_ZN3ccc9FF1x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y14C1Ev();
extern void _ZN3ccc9FF1x11y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y14E[] = {
  NSPAIR(_ZN3ccc9FF1x11y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x11y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x11y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y14E[] = {
  {&(_ZTVN3ccc9FF1x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y14E[];
static VTBL_ENTRY alt_thunk_names431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y14E = {  "_ZN3ccc9FF1x11y14E", // class name
  bases__ZN3ccc9FF1x11y14E, 2,
  &(vtc__ZN3ccc9FF1x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names431,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x11y15  : virtual ::ccc::EE1x11 {
  ~FF1x11y15(); // tgen
  FF1x11y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x11y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2}}
}
namespace ccc { 
ccc::FF1x11y15 ::~FF1x11y15(){ note_dtor("_ZN3ccc9FF1x11y15E", this);} // tgen
ccc::FF1x11y15 ::FF1x11y15(){ note_ctor("_ZN3ccc9FF1x11y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x11y15E, buf);
    ::ccc::FF1x11y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x11y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y15E");
    check_base_class_offset(lv, (::ccc::EE1x11*), 0, "_ZN3ccc9FF1x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x11y15E);
    dp->::ccc::FF1x11y15::~FF1x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x11y15E(Test__ZN3ccc9FF1x11y15E, "_ZN3ccc9FF1x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x11y15C1Ev();
extern void _ZN3ccc9FF1x11y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x11y15E[] = {
  NSPAIR(_ZN3ccc9FF1x11y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x11E[];
static Base_Class bases__ZN3ccc9FF1x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x11y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv)();
extern void _ZN3ccc6EE1x113pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv)();
extern void _ZN3ccc6EE1x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x11y15E[] = {
  {&(_ZTVN3ccc9FF1x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x11y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x11E__NS_9FF1x11y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x11y15E[];
static VTBL_ENTRY alt_thunk_names432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x113efgEv,_ZTv0_n20_N3ccc6EE1x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x113pqrEv,_ZTv0_n16_N3ccc6EE1x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x11y15E = {  "_ZN3ccc9FF1x11y15E", // class name
  bases__ZN3ccc9FF1x11y15E, 2,
  &(vtc__ZN3ccc9FF1x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x11y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x11y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x11y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x11y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names432,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y0  : virtual ::ccc::EE1x12 {
  virtual void  abc(); // _ZN3ccc8FF1x12y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y03pqrEv
  ~FF1x12y0(); // tgen
  FF1x12y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y03abcEv");}
void  ccc::FF1x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y03efgEv");}
void  ccc::FF1x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y03pqrEv");}
ccc::FF1x12y0 ::~FF1x12y0(){ note_dtor("_ZN3ccc8FF1x12y0E", this);} // tgen
ccc::FF1x12y0 ::FF1x12y0(){ note_ctor("_ZN3ccc8FF1x12y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y0E, buf);
    ::ccc::FF1x12y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y0E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y0E);
    dp->::ccc::FF1x12y0::~FF1x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y0E(Test__ZN3ccc8FF1x12y0E, "_ZN3ccc8FF1x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y0C1Ev();
extern void _ZN3ccc8FF1x12y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y0E[] = {
  NSPAIR(_ZN3ccc8FF1x12y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y0E[];
extern void _ZN3ccc8FF1x12y03abcEv();
extern void _ZN3ccc8FF1x12y03pqrEv();
extern void _ZN3ccc8FF1x12y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y0E[] = {
  {&(_ZTVN3ccc8FF1x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y0E[];
static VTBL_ENTRY alt_thunk_names433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y0E = {  "_ZN3ccc8FF1x12y0E", // class name
  bases__ZN3ccc8FF1x12y0E, 2,
  &(vtc__ZN3ccc8FF1x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names433,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y1  : virtual ::ccc::EE1x12 {
  virtual void  abc(); // _ZN3ccc8FF1x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x12y13efgEv
  ~FF1x12y1(); // tgen
  FF1x12y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y13abcEv");}
void  ccc::FF1x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y13pqrEv");}
void  ccc::FF1x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y13efgEv");}
ccc::FF1x12y1 ::~FF1x12y1(){ note_dtor("_ZN3ccc8FF1x12y1E", this);} // tgen
ccc::FF1x12y1 ::FF1x12y1(){ note_ctor("_ZN3ccc8FF1x12y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y1E, buf);
    ::ccc::FF1x12y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y1E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y1E);
    dp->::ccc::FF1x12y1::~FF1x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y1E(Test__ZN3ccc8FF1x12y1E, "_ZN3ccc8FF1x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y1C1Ev();
extern void _ZN3ccc8FF1x12y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y1E[] = {
  NSPAIR(_ZN3ccc8FF1x12y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y1E[];
extern void _ZN3ccc8FF1x12y13abcEv();
extern void _ZN3ccc8FF1x12y13pqrEv();
extern void _ZN3ccc8FF1x12y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y1E[] = {
  {&(_ZTVN3ccc8FF1x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y1E[];
static VTBL_ENTRY alt_thunk_names434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y1E = {  "_ZN3ccc8FF1x12y1E", // class name
  bases__ZN3ccc8FF1x12y1E, 2,
  &(vtc__ZN3ccc8FF1x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names434,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y2  : virtual ::ccc::EE1x12 {
  virtual void  efg(); // _ZN3ccc8FF1x12y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y23pqrEv
  ~FF1x12y2(); // tgen
  FF1x12y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y23efgEv");}
void  ccc::FF1x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y23abcEv");}
void  ccc::FF1x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y23pqrEv");}
ccc::FF1x12y2 ::~FF1x12y2(){ note_dtor("_ZN3ccc8FF1x12y2E", this);} // tgen
ccc::FF1x12y2 ::FF1x12y2(){ note_ctor("_ZN3ccc8FF1x12y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y2E, buf);
    ::ccc::FF1x12y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y2E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y2E);
    dp->::ccc::FF1x12y2::~FF1x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y2E(Test__ZN3ccc8FF1x12y2E, "_ZN3ccc8FF1x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y2C1Ev();
extern void _ZN3ccc8FF1x12y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y2E[] = {
  NSPAIR(_ZN3ccc8FF1x12y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y2E[];
extern void _ZN3ccc8FF1x12y23abcEv();
extern void _ZN3ccc8FF1x12y23pqrEv();
extern void _ZN3ccc8FF1x12y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y2E[] = {
  {&(_ZTVN3ccc8FF1x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y2E[];
static VTBL_ENTRY alt_thunk_names435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y2E = {  "_ZN3ccc8FF1x12y2E", // class name
  bases__ZN3ccc8FF1x12y2E, 2,
  &(vtc__ZN3ccc8FF1x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names435,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y3  : virtual ::ccc::EE1x12 {
  virtual void  efg(); // _ZN3ccc8FF1x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x12y33abcEv
  ~FF1x12y3(); // tgen
  FF1x12y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y33efgEv");}
void  ccc::FF1x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y33pqrEv");}
void  ccc::FF1x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y33abcEv");}
ccc::FF1x12y3 ::~FF1x12y3(){ note_dtor("_ZN3ccc8FF1x12y3E", this);} // tgen
ccc::FF1x12y3 ::FF1x12y3(){ note_ctor("_ZN3ccc8FF1x12y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y3E, buf);
    ::ccc::FF1x12y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y3E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y3E);
    dp->::ccc::FF1x12y3::~FF1x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y3E(Test__ZN3ccc8FF1x12y3E, "_ZN3ccc8FF1x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y3C1Ev();
extern void _ZN3ccc8FF1x12y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y3E[] = {
  NSPAIR(_ZN3ccc8FF1x12y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y3E[];
extern void _ZN3ccc8FF1x12y33abcEv();
extern void _ZN3ccc8FF1x12y33pqrEv();
extern void _ZN3ccc8FF1x12y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y3E[] = {
  {&(_ZTVN3ccc8FF1x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y3E[];
static VTBL_ENTRY alt_thunk_names436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y3E = {  "_ZN3ccc8FF1x12y3E", // class name
  bases__ZN3ccc8FF1x12y3E, 2,
  &(vtc__ZN3ccc8FF1x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names436,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y4  : virtual ::ccc::EE1x12 {
  virtual void  pqr(); // _ZN3ccc8FF1x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x12y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x12y43efgEv
  ~FF1x12y4(); // tgen
  FF1x12y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y43pqrEv");}
void  ccc::FF1x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y43abcEv");}
void  ccc::FF1x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y43efgEv");}
ccc::FF1x12y4 ::~FF1x12y4(){ note_dtor("_ZN3ccc8FF1x12y4E", this);} // tgen
ccc::FF1x12y4 ::FF1x12y4(){ note_ctor("_ZN3ccc8FF1x12y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y4E, buf);
    ::ccc::FF1x12y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y4E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y4E);
    dp->::ccc::FF1x12y4::~FF1x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y4E(Test__ZN3ccc8FF1x12y4E, "_ZN3ccc8FF1x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y4C1Ev();
extern void _ZN3ccc8FF1x12y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y4E[] = {
  NSPAIR(_ZN3ccc8FF1x12y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y4E[];
extern void _ZN3ccc8FF1x12y43abcEv();
extern void _ZN3ccc8FF1x12y43pqrEv();
extern void _ZN3ccc8FF1x12y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y4E[] = {
  {&(_ZTVN3ccc8FF1x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y4E[];
static VTBL_ENTRY alt_thunk_names437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y4E = {  "_ZN3ccc8FF1x12y4E", // class name
  bases__ZN3ccc8FF1x12y4E, 2,
  &(vtc__ZN3ccc8FF1x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names437,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y5  : virtual ::ccc::EE1x12 {
  virtual void  pqr(); // _ZN3ccc8FF1x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x12y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x12y53abcEv
  ~FF1x12y5(); // tgen
  FF1x12y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y53pqrEv");}
void  ccc::FF1x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y53efgEv");}
void  ccc::FF1x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y53abcEv");}
ccc::FF1x12y5 ::~FF1x12y5(){ note_dtor("_ZN3ccc8FF1x12y5E", this);} // tgen
ccc::FF1x12y5 ::FF1x12y5(){ note_ctor("_ZN3ccc8FF1x12y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y5E, buf);
    ::ccc::FF1x12y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y5E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y5E);
    dp->::ccc::FF1x12y5::~FF1x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y5E(Test__ZN3ccc8FF1x12y5E, "_ZN3ccc8FF1x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y5C1Ev();
extern void _ZN3ccc8FF1x12y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y5E[] = {
  NSPAIR(_ZN3ccc8FF1x12y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y5E[];
extern void _ZN3ccc8FF1x12y53abcEv();
extern void _ZN3ccc8FF1x12y53pqrEv();
extern void _ZN3ccc8FF1x12y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y5E[] = {
  {&(_ZTVN3ccc8FF1x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y5E[];
static VTBL_ENTRY alt_thunk_names438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y5E = {  "_ZN3ccc8FF1x12y5E", // class name
  bases__ZN3ccc8FF1x12y5E, 2,
  &(vtc__ZN3ccc8FF1x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names438,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y6  : virtual ::ccc::EE1x12 {
  virtual void  abc(); // _ZN3ccc8FF1x12y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x12y63efgEv
  ~FF1x12y6(); // tgen
  FF1x12y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y63abcEv");}
void  ccc::FF1x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y63efgEv");}
ccc::FF1x12y6 ::~FF1x12y6(){ note_dtor("_ZN3ccc8FF1x12y6E", this);} // tgen
ccc::FF1x12y6 ::FF1x12y6(){ note_ctor("_ZN3ccc8FF1x12y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y6E, buf);
    ::ccc::FF1x12y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y6E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y6E);
    dp->::ccc::FF1x12y6::~FF1x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y6E(Test__ZN3ccc8FF1x12y6E, "_ZN3ccc8FF1x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y6C1Ev();
extern void _ZN3ccc8FF1x12y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y6E[] = {
  NSPAIR(_ZN3ccc8FF1x12y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y6E[];
extern void _ZN3ccc8FF1x12y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x12y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y6E[] = {
  {&(_ZTVN3ccc8FF1x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y6E[];
static VTBL_ENTRY alt_thunk_names439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y6E = {  "_ZN3ccc8FF1x12y6E", // class name
  bases__ZN3ccc8FF1x12y6E, 2,
  &(vtc__ZN3ccc8FF1x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y6E),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
namespace ccc { 
struct  FF1x12y7  : virtual ::ccc::EE1x12 {
  virtual void  abc(); // _ZN3ccc8FF1x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y73pqrEv
  ~FF1x12y7(); // tgen
  FF1x12y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y73abcEv");}
void  ccc::FF1x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y73pqrEv");}
ccc::FF1x12y7 ::~FF1x12y7(){ note_dtor("_ZN3ccc8FF1x12y7E", this);} // tgen
ccc::FF1x12y7 ::FF1x12y7(){ note_ctor("_ZN3ccc8FF1x12y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y7E, buf);
    ::ccc::FF1x12y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y7E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y7E);
    dp->::ccc::FF1x12y7::~FF1x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y7E(Test__ZN3ccc8FF1x12y7E, "_ZN3ccc8FF1x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y7C1Ev();
extern void _ZN3ccc8FF1x12y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y7E[] = {
  NSPAIR(_ZN3ccc8FF1x12y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y7E[];
extern void _ZN3ccc8FF1x12y73abcEv();
extern void _ZN3ccc8FF1x12y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y7E[] = {
  {&(_ZTVN3ccc8FF1x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y7E[];
static VTBL_ENTRY alt_thunk_names440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y7E = {  "_ZN3ccc8FF1x12y7E", // class name
  bases__ZN3ccc8FF1x12y7E, 2,
  &(vtc__ZN3ccc8FF1x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names440,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y8  : virtual ::ccc::EE1x12 {
  virtual void  efg(); // _ZN3ccc8FF1x12y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x12y83abcEv
  ~FF1x12y8(); // tgen
  FF1x12y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y83efgEv");}
void  ccc::FF1x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x12y83abcEv");}
ccc::FF1x12y8 ::~FF1x12y8(){ note_dtor("_ZN3ccc8FF1x12y8E", this);} // tgen
ccc::FF1x12y8 ::FF1x12y8(){ note_ctor("_ZN3ccc8FF1x12y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y8E, buf);
    ::ccc::FF1x12y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y8E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y8E);
    dp->::ccc::FF1x12y8::~FF1x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y8E(Test__ZN3ccc8FF1x12y8E, "_ZN3ccc8FF1x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y8C1Ev();
extern void _ZN3ccc8FF1x12y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y8E[] = {
  NSPAIR(_ZN3ccc8FF1x12y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y8E[];
extern void _ZN3ccc8FF1x12y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x12y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y8E[] = {
  {&(_ZTVN3ccc8FF1x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y8E[];
static VTBL_ENTRY alt_thunk_names441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y8E = {  "_ZN3ccc8FF1x12y8E", // class name
  bases__ZN3ccc8FF1x12y8E, 2,
  &(vtc__ZN3ccc8FF1x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names441,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y9  : virtual ::ccc::EE1x12 {
  virtual void  efg(); // _ZN3ccc8FF1x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x12y93pqrEv
  ~FF1x12y9(); // tgen
  FF1x12y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x12y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x12y93efgEv");}
void  ccc::FF1x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x12y93pqrEv");}
ccc::FF1x12y9 ::~FF1x12y9(){ note_dtor("_ZN3ccc8FF1x12y9E", this);} // tgen
ccc::FF1x12y9 ::FF1x12y9(){ note_ctor("_ZN3ccc8FF1x12y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x12y9E, buf);
    ::ccc::FF1x12y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x12y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y9E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc8FF1x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x12y9E);
    dp->::ccc::FF1x12y9::~FF1x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x12y9E(Test__ZN3ccc8FF1x12y9E, "_ZN3ccc8FF1x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x12y9C1Ev();
extern void _ZN3ccc8FF1x12y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x12y9E[] = {
  NSPAIR(_ZN3ccc8FF1x12y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc8FF1x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc8FF1x12y93pqrEv();
extern void _ZN3ccc8FF1x12y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x12y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x12y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x12y9E[] = {
  {&(_ZTVN3ccc8FF1x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x12y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_8FF1x12y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x12y9E[];
static VTBL_ENTRY alt_thunk_names442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x12y9E = {  "_ZN3ccc8FF1x12y9E", // class name
  bases__ZN3ccc8FF1x12y9E, 2,
  &(vtc__ZN3ccc8FF1x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x12y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x12y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x12y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x12y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names442,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y10  : virtual ::ccc::EE1x12 {
  virtual void  pqr(); // _ZN3ccc9FF1x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x12y103abcEv
  ~FF1x12y10(); // tgen
  FF1x12y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x12y103pqrEv");}
void  ccc::FF1x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x12y103abcEv");}
ccc::FF1x12y10 ::~FF1x12y10(){ note_dtor("_ZN3ccc9FF1x12y10E", this);} // tgen
ccc::FF1x12y10 ::FF1x12y10(){ note_ctor("_ZN3ccc9FF1x12y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y10E, buf);
    ::ccc::FF1x12y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y10E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y10E);
    dp->::ccc::FF1x12y10::~FF1x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y10E(Test__ZN3ccc9FF1x12y10E, "_ZN3ccc9FF1x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y10C1Ev();
extern void _ZN3ccc9FF1x12y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y10E[] = {
  NSPAIR(_ZN3ccc9FF1x12y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y10E[];
extern void _ZN3ccc9FF1x12y103abcEv();
extern void _ZN3ccc9FF1x12y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y10E[] = {
  {&(_ZTVN3ccc9FF1x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y10E[];
static VTBL_ENTRY alt_thunk_names443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y10E = {  "_ZN3ccc9FF1x12y10E", // class name
  bases__ZN3ccc9FF1x12y10E, 2,
  &(vtc__ZN3ccc9FF1x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names443,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y11  : virtual ::ccc::EE1x12 {
  virtual void  pqr(); // _ZN3ccc9FF1x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x12y113efgEv
  ~FF1x12y11(); // tgen
  FF1x12y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x12y113pqrEv");}
void  ccc::FF1x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x12y113efgEv");}
ccc::FF1x12y11 ::~FF1x12y11(){ note_dtor("_ZN3ccc9FF1x12y11E", this);} // tgen
ccc::FF1x12y11 ::FF1x12y11(){ note_ctor("_ZN3ccc9FF1x12y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y11E, buf);
    ::ccc::FF1x12y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y11E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y11E);
    dp->::ccc::FF1x12y11::~FF1x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y11E(Test__ZN3ccc9FF1x12y11E, "_ZN3ccc9FF1x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y11C1Ev();
extern void _ZN3ccc9FF1x12y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y11E[] = {
  NSPAIR(_ZN3ccc9FF1x12y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF1x12y113pqrEv();
extern void _ZN3ccc9FF1x12y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y11E[] = {
  {&(_ZTVN3ccc9FF1x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y11E[];
static VTBL_ENTRY alt_thunk_names444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y11E = {  "_ZN3ccc9FF1x12y11E", // class name
  bases__ZN3ccc9FF1x12y11E, 2,
  &(vtc__ZN3ccc9FF1x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names444,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y12  : virtual ::ccc::EE1x12 {
  virtual void  abc(); // _ZN3ccc9FF1x12y123abcEv
  ~FF1x12y12(); // tgen
  FF1x12y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF1x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x12y123abcEv");}
ccc::FF1x12y12 ::~FF1x12y12(){ note_dtor("_ZN3ccc9FF1x12y12E", this);} // tgen
ccc::FF1x12y12 ::FF1x12y12(){ note_ctor("_ZN3ccc9FF1x12y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y12E, buf);
    ::ccc::FF1x12y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y12E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y12E);
    dp->::ccc::FF1x12y12::~FF1x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y12E(Test__ZN3ccc9FF1x12y12E, "_ZN3ccc9FF1x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y12C1Ev();
extern void _ZN3ccc9FF1x12y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y12E[] = {
  NSPAIR(_ZN3ccc9FF1x12y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y12E[];
extern void _ZN3ccc9FF1x12y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y12E[] = {
  {&(_ZTVN3ccc9FF1x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y12E[];
static VTBL_ENTRY alt_thunk_names445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y12E = {  "_ZN3ccc9FF1x12y12E", // class name
  bases__ZN3ccc9FF1x12y12E, 2,
  &(vtc__ZN3ccc9FF1x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names445,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y13  : virtual ::ccc::EE1x12 {
  virtual void  efg(); // _ZN3ccc9FF1x12y133efgEv
  ~FF1x12y13(); // tgen
  FF1x12y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF1x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x12y133efgEv");}
ccc::FF1x12y13 ::~FF1x12y13(){ note_dtor("_ZN3ccc9FF1x12y13E", this);} // tgen
ccc::FF1x12y13 ::FF1x12y13(){ note_ctor("_ZN3ccc9FF1x12y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y13E, buf);
    ::ccc::FF1x12y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y13E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y13E);
    dp->::ccc::FF1x12y13::~FF1x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y13E(Test__ZN3ccc9FF1x12y13E, "_ZN3ccc9FF1x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y13C1Ev();
extern void _ZN3ccc9FF1x12y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y13E[] = {
  NSPAIR(_ZN3ccc9FF1x12y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9FF1x12y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y13E[] = {
  {&(_ZTVN3ccc9FF1x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y13E[];
static VTBL_ENTRY alt_thunk_names446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y13E = {  "_ZN3ccc9FF1x12y13E", // class name
  bases__ZN3ccc9FF1x12y13E, 2,
  &(vtc__ZN3ccc9FF1x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names446,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y14  : virtual ::ccc::EE1x12 {
  virtual void  pqr(); // _ZN3ccc9FF1x12y143pqrEv
  ~FF1x12y14(); // tgen
  FF1x12y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF1x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x12y143pqrEv");}
ccc::FF1x12y14 ::~FF1x12y14(){ note_dtor("_ZN3ccc9FF1x12y14E", this);} // tgen
ccc::FF1x12y14 ::FF1x12y14(){ note_ctor("_ZN3ccc9FF1x12y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y14E, buf);
    ::ccc::FF1x12y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y14E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y14E);
    dp->::ccc::FF1x12y14::~FF1x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y14E(Test__ZN3ccc9FF1x12y14E, "_ZN3ccc9FF1x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y14C1Ev();
extern void _ZN3ccc9FF1x12y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y14E[] = {
  NSPAIR(_ZN3ccc9FF1x12y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF1x12y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y14E[] = {
  {&(_ZTVN3ccc9FF1x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y14E[];
static VTBL_ENTRY alt_thunk_names447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y14E = {  "_ZN3ccc9FF1x12y14E", // class name
  bases__ZN3ccc9FF1x12y14E, 2,
  &(vtc__ZN3ccc9FF1x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names447,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x12y15  : virtual ::ccc::EE1x12 {
  ~FF1x12y15(); // tgen
  FF1x12y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x12y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1}}
}
namespace ccc { 
ccc::FF1x12y15 ::~FF1x12y15(){ note_dtor("_ZN3ccc9FF1x12y15E", this);} // tgen
ccc::FF1x12y15 ::FF1x12y15(){ note_ctor("_ZN3ccc9FF1x12y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x12y15E, buf);
    ::ccc::FF1x12y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x12y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y15E");
    check_base_class_offset(lv, (::ccc::EE1x12*), 0, "_ZN3ccc9FF1x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x12y15E);
    dp->::ccc::FF1x12y15::~FF1x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x12y15E(Test__ZN3ccc9FF1x12y15E, "_ZN3ccc9FF1x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x12y15C1Ev();
extern void _ZN3ccc9FF1x12y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x12y15E[] = {
  NSPAIR(_ZN3ccc9FF1x12y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x12E[];
static Base_Class bases__ZN3ccc9FF1x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x12y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x12y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv)();
extern void _ZN3ccc6EE1x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x12y15E[] = {
  {&(_ZTVN3ccc9FF1x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x12y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x12E__NS_9FF1x12y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x12y15E[];
static VTBL_ENTRY alt_thunk_names448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE1x123abcEv,_ZTv0_n12_N3ccc6EE1x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x12y15E = {  "_ZN3ccc9FF1x12y15E", // class name
  bases__ZN3ccc9FF1x12y15E, 2,
  &(vtc__ZN3ccc9FF1x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x12y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x12y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x12y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x12y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names448,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y0  : virtual ::ccc::EE1x13 {
  virtual void  abc(); // _ZN3ccc8FF1x13y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y03pqrEv
  ~FF1x13y0(); // tgen
  FF1x13y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y03abcEv");}
void  ccc::FF1x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y03efgEv");}
void  ccc::FF1x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y03pqrEv");}
ccc::FF1x13y0 ::~FF1x13y0(){ note_dtor("_ZN3ccc8FF1x13y0E", this);} // tgen
ccc::FF1x13y0 ::FF1x13y0(){ note_ctor("_ZN3ccc8FF1x13y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y0E, buf);
    ::ccc::FF1x13y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y0E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y0E);
    dp->::ccc::FF1x13y0::~FF1x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y0E(Test__ZN3ccc8FF1x13y0E, "_ZN3ccc8FF1x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y0C1Ev();
extern void _ZN3ccc8FF1x13y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y0E[] = {
  NSPAIR(_ZN3ccc8FF1x13y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y0E[];
extern void _ZN3ccc8FF1x13y03abcEv();
extern void _ZN3ccc8FF1x13y03pqrEv();
extern void _ZN3ccc8FF1x13y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y0E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y0E[] = {
  {&(_ZTVN3ccc8FF1x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y0E[];
static VTBL_ENTRY alt_thunk_names449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y0E = {  "_ZN3ccc8FF1x13y0E", // class name
  bases__ZN3ccc8FF1x13y0E, 2,
  &(vtc__ZN3ccc8FF1x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names449,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y1  : virtual ::ccc::EE1x13 {
  virtual void  abc(); // _ZN3ccc8FF1x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x13y13efgEv
  ~FF1x13y1(); // tgen
  FF1x13y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y13abcEv");}
void  ccc::FF1x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y13pqrEv");}
void  ccc::FF1x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y13efgEv");}
ccc::FF1x13y1 ::~FF1x13y1(){ note_dtor("_ZN3ccc8FF1x13y1E", this);} // tgen
ccc::FF1x13y1 ::FF1x13y1(){ note_ctor("_ZN3ccc8FF1x13y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y1E, buf);
    ::ccc::FF1x13y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y1E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y1E);
    dp->::ccc::FF1x13y1::~FF1x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y1E(Test__ZN3ccc8FF1x13y1E, "_ZN3ccc8FF1x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y1C1Ev();
extern void _ZN3ccc8FF1x13y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y1E[] = {
  NSPAIR(_ZN3ccc8FF1x13y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y1E[];
extern void _ZN3ccc8FF1x13y13abcEv();
extern void _ZN3ccc8FF1x13y13pqrEv();
extern void _ZN3ccc8FF1x13y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y1E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y1E[] = {
  {&(_ZTVN3ccc8FF1x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y1E[];
static VTBL_ENTRY alt_thunk_names450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y1E = {  "_ZN3ccc8FF1x13y1E", // class name
  bases__ZN3ccc8FF1x13y1E, 2,
  &(vtc__ZN3ccc8FF1x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names450,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y2  : virtual ::ccc::EE1x13 {
  virtual void  efg(); // _ZN3ccc8FF1x13y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y23pqrEv
  ~FF1x13y2(); // tgen
  FF1x13y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y23efgEv");}
void  ccc::FF1x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y23abcEv");}
void  ccc::FF1x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y23pqrEv");}
ccc::FF1x13y2 ::~FF1x13y2(){ note_dtor("_ZN3ccc8FF1x13y2E", this);} // tgen
ccc::FF1x13y2 ::FF1x13y2(){ note_ctor("_ZN3ccc8FF1x13y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y2E, buf);
    ::ccc::FF1x13y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y2E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y2E);
    dp->::ccc::FF1x13y2::~FF1x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y2E(Test__ZN3ccc8FF1x13y2E, "_ZN3ccc8FF1x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y2C1Ev();
extern void _ZN3ccc8FF1x13y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y2E[] = {
  NSPAIR(_ZN3ccc8FF1x13y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y2E[];
extern void _ZN3ccc8FF1x13y23abcEv();
extern void _ZN3ccc8FF1x13y23pqrEv();
extern void _ZN3ccc8FF1x13y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y2E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y2E[] = {
  {&(_ZTVN3ccc8FF1x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y2E[];
static VTBL_ENTRY alt_thunk_names451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y2E = {  "_ZN3ccc8FF1x13y2E", // class name
  bases__ZN3ccc8FF1x13y2E, 2,
  &(vtc__ZN3ccc8FF1x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names451,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y3  : virtual ::ccc::EE1x13 {
  virtual void  efg(); // _ZN3ccc8FF1x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x13y33abcEv
  ~FF1x13y3(); // tgen
  FF1x13y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y33efgEv");}
void  ccc::FF1x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y33pqrEv");}
void  ccc::FF1x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y33abcEv");}
ccc::FF1x13y3 ::~FF1x13y3(){ note_dtor("_ZN3ccc8FF1x13y3E", this);} // tgen
ccc::FF1x13y3 ::FF1x13y3(){ note_ctor("_ZN3ccc8FF1x13y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y3E, buf);
    ::ccc::FF1x13y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y3E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y3E);
    dp->::ccc::FF1x13y3::~FF1x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y3E(Test__ZN3ccc8FF1x13y3E, "_ZN3ccc8FF1x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y3C1Ev();
extern void _ZN3ccc8FF1x13y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y3E[] = {
  NSPAIR(_ZN3ccc8FF1x13y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y3E[];
extern void _ZN3ccc8FF1x13y33abcEv();
extern void _ZN3ccc8FF1x13y33pqrEv();
extern void _ZN3ccc8FF1x13y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y3E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y3E[] = {
  {&(_ZTVN3ccc8FF1x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y3E[];
static VTBL_ENTRY alt_thunk_names452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y3E = {  "_ZN3ccc8FF1x13y3E", // class name
  bases__ZN3ccc8FF1x13y3E, 2,
  &(vtc__ZN3ccc8FF1x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names452,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y4  : virtual ::ccc::EE1x13 {
  virtual void  pqr(); // _ZN3ccc8FF1x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x13y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x13y43efgEv
  ~FF1x13y4(); // tgen
  FF1x13y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y43pqrEv");}
void  ccc::FF1x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y43abcEv");}
void  ccc::FF1x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y43efgEv");}
ccc::FF1x13y4 ::~FF1x13y4(){ note_dtor("_ZN3ccc8FF1x13y4E", this);} // tgen
ccc::FF1x13y4 ::FF1x13y4(){ note_ctor("_ZN3ccc8FF1x13y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y4E, buf);
    ::ccc::FF1x13y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y4E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y4E);
    dp->::ccc::FF1x13y4::~FF1x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y4E(Test__ZN3ccc8FF1x13y4E, "_ZN3ccc8FF1x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y4C1Ev();
extern void _ZN3ccc8FF1x13y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y4E[] = {
  NSPAIR(_ZN3ccc8FF1x13y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y4E[];
extern void _ZN3ccc8FF1x13y43abcEv();
extern void _ZN3ccc8FF1x13y43pqrEv();
extern void _ZN3ccc8FF1x13y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y4E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y4E[] = {
  {&(_ZTVN3ccc8FF1x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y4E[];
static VTBL_ENTRY alt_thunk_names453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y4E = {  "_ZN3ccc8FF1x13y4E", // class name
  bases__ZN3ccc8FF1x13y4E, 2,
  &(vtc__ZN3ccc8FF1x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names453,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y5  : virtual ::ccc::EE1x13 {
  virtual void  pqr(); // _ZN3ccc8FF1x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x13y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x13y53abcEv
  ~FF1x13y5(); // tgen
  FF1x13y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y53pqrEv");}
void  ccc::FF1x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y53efgEv");}
void  ccc::FF1x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y53abcEv");}
ccc::FF1x13y5 ::~FF1x13y5(){ note_dtor("_ZN3ccc8FF1x13y5E", this);} // tgen
ccc::FF1x13y5 ::FF1x13y5(){ note_ctor("_ZN3ccc8FF1x13y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y5E, buf);
    ::ccc::FF1x13y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y5E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y5E);
    dp->::ccc::FF1x13y5::~FF1x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y5E(Test__ZN3ccc8FF1x13y5E, "_ZN3ccc8FF1x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y5C1Ev();
extern void _ZN3ccc8FF1x13y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y5E[] = {
  NSPAIR(_ZN3ccc8FF1x13y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y5E[];
extern void _ZN3ccc8FF1x13y53abcEv();
extern void _ZN3ccc8FF1x13y53pqrEv();
extern void _ZN3ccc8FF1x13y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y5E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y5E[] = {
  {&(_ZTVN3ccc8FF1x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y5E[];
static VTBL_ENTRY alt_thunk_names454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y5E = {  "_ZN3ccc8FF1x13y5E", // class name
  bases__ZN3ccc8FF1x13y5E, 2,
  &(vtc__ZN3ccc8FF1x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names454,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y6  : virtual ::ccc::EE1x13 {
  virtual void  abc(); // _ZN3ccc8FF1x13y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x13y63efgEv
  ~FF1x13y6(); // tgen
  FF1x13y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y63abcEv");}
void  ccc::FF1x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y63efgEv");}
ccc::FF1x13y6 ::~FF1x13y6(){ note_dtor("_ZN3ccc8FF1x13y6E", this);} // tgen
ccc::FF1x13y6 ::FF1x13y6(){ note_ctor("_ZN3ccc8FF1x13y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y6E, buf);
    ::ccc::FF1x13y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y6E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y6E);
    dp->::ccc::FF1x13y6::~FF1x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y6E(Test__ZN3ccc8FF1x13y6E, "_ZN3ccc8FF1x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y6C1Ev();
extern void _ZN3ccc8FF1x13y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y6E[] = {
  NSPAIR(_ZN3ccc8FF1x13y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y6E[];
extern void _ZN3ccc8FF1x13y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x13y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y6E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y6E[] = {
  {&(_ZTVN3ccc8FF1x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y6E[];
static VTBL_ENTRY alt_thunk_names455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y6E = {  "_ZN3ccc8FF1x13y6E", // class name
  bases__ZN3ccc8FF1x13y6E, 2,
  &(vtc__ZN3ccc8FF1x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names455,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y7  : virtual ::ccc::EE1x13 {
  virtual void  abc(); // _ZN3ccc8FF1x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y73pqrEv
  ~FF1x13y7(); // tgen
  FF1x13y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y73abcEv");}
void  ccc::FF1x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y73pqrEv");}
ccc::FF1x13y7 ::~FF1x13y7(){ note_dtor("_ZN3ccc8FF1x13y7E", this);} // tgen
ccc::FF1x13y7 ::FF1x13y7(){ note_ctor("_ZN3ccc8FF1x13y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y7E, buf);
    ::ccc::FF1x13y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y7E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y7E);
    dp->::ccc::FF1x13y7::~FF1x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y7E(Test__ZN3ccc8FF1x13y7E, "_ZN3ccc8FF1x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y7C1Ev();
extern void _ZN3ccc8FF1x13y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y7E[] = {
  NSPAIR(_ZN3ccc8FF1x13y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y7E[];
extern void _ZN3ccc8FF1x13y73abcEv();
extern void _ZN3ccc8FF1x13y73pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y73pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y7E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y7E[] = {
  {&(_ZTVN3ccc8FF1x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y7E[];
static VTBL_ENTRY alt_thunk_names456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y7E = {  "_ZN3ccc8FF1x13y7E", // class name
  bases__ZN3ccc8FF1x13y7E, 2,
  &(vtc__ZN3ccc8FF1x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names456,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y8  : virtual ::ccc::EE1x13 {
  virtual void  efg(); // _ZN3ccc8FF1x13y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x13y83abcEv
  ~FF1x13y8(); // tgen
  FF1x13y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y83efgEv");}
void  ccc::FF1x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x13y83abcEv");}
ccc::FF1x13y8 ::~FF1x13y8(){ note_dtor("_ZN3ccc8FF1x13y8E", this);} // tgen
ccc::FF1x13y8 ::FF1x13y8(){ note_ctor("_ZN3ccc8FF1x13y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y8E, buf);
    ::ccc::FF1x13y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y8E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y8E);
    dp->::ccc::FF1x13y8::~FF1x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y8E(Test__ZN3ccc8FF1x13y8E, "_ZN3ccc8FF1x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y8C1Ev();
extern void _ZN3ccc8FF1x13y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y8E[] = {
  NSPAIR(_ZN3ccc8FF1x13y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y8E[];
extern void _ZN3ccc8FF1x13y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x13y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y8E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y8E[] = {
  {&(_ZTVN3ccc8FF1x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y8E[];
static VTBL_ENTRY alt_thunk_names457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y8E = {  "_ZN3ccc8FF1x13y8E", // class name
  bases__ZN3ccc8FF1x13y8E, 2,
  &(vtc__ZN3ccc8FF1x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y8E),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
namespace ccc { 
struct  FF1x13y9  : virtual ::ccc::EE1x13 {
  virtual void  efg(); // _ZN3ccc8FF1x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x13y93pqrEv
  ~FF1x13y9(); // tgen
  FF1x13y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x13y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x13y93efgEv");}
void  ccc::FF1x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x13y93pqrEv");}
ccc::FF1x13y9 ::~FF1x13y9(){ note_dtor("_ZN3ccc8FF1x13y9E", this);} // tgen
ccc::FF1x13y9 ::FF1x13y9(){ note_ctor("_ZN3ccc8FF1x13y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x13y9E, buf);
    ::ccc::FF1x13y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x13y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y9E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc8FF1x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x13y9E);
    dp->::ccc::FF1x13y9::~FF1x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x13y9E(Test__ZN3ccc8FF1x13y9E, "_ZN3ccc8FF1x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x13y9C1Ev();
extern void _ZN3ccc8FF1x13y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x13y9E[] = {
  NSPAIR(_ZN3ccc8FF1x13y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc8FF1x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x13y93pqrEv();
extern void _ZN3ccc8FF1x13y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x13y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x13y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x13y9E[] = {
  {&(_ZTVN3ccc8FF1x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x13y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_8FF1x13y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x13y9E[];
static VTBL_ENTRY alt_thunk_names458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x13y9E = {  "_ZN3ccc8FF1x13y9E", // class name
  bases__ZN3ccc8FF1x13y9E, 2,
  &(vtc__ZN3ccc8FF1x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x13y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x13y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x13y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x13y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names458,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y10  : virtual ::ccc::EE1x13 {
  virtual void  pqr(); // _ZN3ccc9FF1x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x13y103abcEv
  ~FF1x13y10(); // tgen
  FF1x13y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x13y103pqrEv");}
void  ccc::FF1x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x13y103abcEv");}
ccc::FF1x13y10 ::~FF1x13y10(){ note_dtor("_ZN3ccc9FF1x13y10E", this);} // tgen
ccc::FF1x13y10 ::FF1x13y10(){ note_ctor("_ZN3ccc9FF1x13y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y10E, buf);
    ::ccc::FF1x13y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y10E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y10E);
    dp->::ccc::FF1x13y10::~FF1x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y10E(Test__ZN3ccc9FF1x13y10E, "_ZN3ccc9FF1x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y10C1Ev();
extern void _ZN3ccc9FF1x13y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y10E[] = {
  NSPAIR(_ZN3ccc9FF1x13y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y10E[];
extern void _ZN3ccc9FF1x13y103abcEv();
extern void _ZN3ccc9FF1x13y103pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y10E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y10E[] = {
  {&(_ZTVN3ccc9FF1x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y10E[];
static VTBL_ENTRY alt_thunk_names459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y10E = {  "_ZN3ccc9FF1x13y10E", // class name
  bases__ZN3ccc9FF1x13y10E, 2,
  &(vtc__ZN3ccc9FF1x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names459,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y11  : virtual ::ccc::EE1x13 {
  virtual void  pqr(); // _ZN3ccc9FF1x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x13y113efgEv
  ~FF1x13y11(); // tgen
  FF1x13y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x13y113pqrEv");}
void  ccc::FF1x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x13y113efgEv");}
ccc::FF1x13y11 ::~FF1x13y11(){ note_dtor("_ZN3ccc9FF1x13y11E", this);} // tgen
ccc::FF1x13y11 ::FF1x13y11(){ note_ctor("_ZN3ccc9FF1x13y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y11E, buf);
    ::ccc::FF1x13y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y11E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y11E);
    dp->::ccc::FF1x13y11::~FF1x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y11E(Test__ZN3ccc9FF1x13y11E, "_ZN3ccc9FF1x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y11C1Ev();
extern void _ZN3ccc9FF1x13y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y11E[] = {
  NSPAIR(_ZN3ccc9FF1x13y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x13y113pqrEv();
extern void _ZN3ccc9FF1x13y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y11E[] = {
  {&(_ZTVN3ccc9FF1x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y11E[];
static VTBL_ENTRY alt_thunk_names460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y11E = {  "_ZN3ccc9FF1x13y11E", // class name
  bases__ZN3ccc9FF1x13y11E, 2,
  &(vtc__ZN3ccc9FF1x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names460,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y12  : virtual ::ccc::EE1x13 {
  virtual void  abc(); // _ZN3ccc9FF1x13y123abcEv
  ~FF1x13y12(); // tgen
  FF1x13y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y12E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF1x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x13y123abcEv");}
ccc::FF1x13y12 ::~FF1x13y12(){ note_dtor("_ZN3ccc9FF1x13y12E", this);} // tgen
ccc::FF1x13y12 ::FF1x13y12(){ note_ctor("_ZN3ccc9FF1x13y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y12E, buf);
    ::ccc::FF1x13y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y12E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y12E);
    dp->::ccc::FF1x13y12::~FF1x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y12E(Test__ZN3ccc9FF1x13y12E, "_ZN3ccc9FF1x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y12C1Ev();
extern void _ZN3ccc9FF1x13y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y12E[] = {
  NSPAIR(_ZN3ccc9FF1x13y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y12E[];
extern void _ZN3ccc9FF1x13y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y12E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y12E[] = {
  {&(_ZTVN3ccc9FF1x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y12E[];
static VTBL_ENTRY alt_thunk_names461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y12E = {  "_ZN3ccc9FF1x13y12E", // class name
  bases__ZN3ccc9FF1x13y12E, 2,
  &(vtc__ZN3ccc9FF1x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names461,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y13  : virtual ::ccc::EE1x13 {
  virtual void  efg(); // _ZN3ccc9FF1x13y133efgEv
  ~FF1x13y13(); // tgen
  FF1x13y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1}
}
namespace ccc { 
void  ccc::FF1x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x13y133efgEv");}
ccc::FF1x13y13 ::~FF1x13y13(){ note_dtor("_ZN3ccc9FF1x13y13E", this);} // tgen
ccc::FF1x13y13 ::FF1x13y13(){ note_ctor("_ZN3ccc9FF1x13y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y13E, buf);
    ::ccc::FF1x13y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y13E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y13E);
    dp->::ccc::FF1x13y13::~FF1x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y13E(Test__ZN3ccc9FF1x13y13E, "_ZN3ccc9FF1x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y13C1Ev();
extern void _ZN3ccc9FF1x13y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y13E[] = {
  NSPAIR(_ZN3ccc9FF1x13y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9FF1x13y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y13E[] = {
  {&(_ZTVN3ccc9FF1x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y13E[];
static VTBL_ENTRY alt_thunk_names462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y13E = {  "_ZN3ccc9FF1x13y13E", // class name
  bases__ZN3ccc9FF1x13y13E, 2,
  &(vtc__ZN3ccc9FF1x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names462,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y14  : virtual ::ccc::EE1x13 {
  virtual void  pqr(); // _ZN3ccc9FF1x13y143pqrEv
  ~FF1x13y14(); // tgen
  FF1x13y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF1x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x13y143pqrEv");}
ccc::FF1x13y14 ::~FF1x13y14(){ note_dtor("_ZN3ccc9FF1x13y14E", this);} // tgen
ccc::FF1x13y14 ::FF1x13y14(){ note_ctor("_ZN3ccc9FF1x13y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y14E, buf);
    ::ccc::FF1x13y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y14E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y14E);
    dp->::ccc::FF1x13y14::~FF1x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y14E(Test__ZN3ccc9FF1x13y14E, "_ZN3ccc9FF1x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y14C1Ev();
extern void _ZN3ccc9FF1x13y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y14E[] = {
  NSPAIR(_ZN3ccc9FF1x13y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x13y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x13y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y14E[] = {
  {&(_ZTVN3ccc9FF1x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y14E[];
static VTBL_ENTRY alt_thunk_names463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y14E = {  "_ZN3ccc9FF1x13y14E", // class name
  bases__ZN3ccc9FF1x13y14E, 2,
  &(vtc__ZN3ccc9FF1x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names463,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x13y15  : virtual ::ccc::EE1x13 {
  ~FF1x13y15(); // tgen
  FF1x13y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x13y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1}}
}
namespace ccc { 
ccc::FF1x13y15 ::~FF1x13y15(){ note_dtor("_ZN3ccc9FF1x13y15E", this);} // tgen
ccc::FF1x13y15 ::FF1x13y15(){ note_ctor("_ZN3ccc9FF1x13y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x13y15E, buf);
    ::ccc::FF1x13y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x13y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y15E");
    check_base_class_offset(lv, (::ccc::EE1x13*), 0, "_ZN3ccc9FF1x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x13y15E);
    dp->::ccc::FF1x13y15::~FF1x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x13y15E(Test__ZN3ccc9FF1x13y15E, "_ZN3ccc9FF1x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x13y15C1Ev();
extern void _ZN3ccc9FF1x13y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x13y15E[] = {
  NSPAIR(_ZN3ccc9FF1x13y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x13E[];
static Base_Class bases__ZN3ccc9FF1x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF1x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x13y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv)();
extern void _ZN3ccc6EE1x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x13y15E[] = {
  {&(_ZTVN3ccc9FF1x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x13y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x13E__NS_9FF1x13y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x13y15E[];
static VTBL_ENTRY alt_thunk_names464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE1x133efgEv,_ZTv0_n20_N3ccc6EE1x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x13y15E = {  "_ZN3ccc9FF1x13y15E", // class name
  bases__ZN3ccc9FF1x13y15E, 2,
  &(vtc__ZN3ccc9FF1x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x13y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x13y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x13y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x13y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names464,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y0  : virtual ::ccc::EE1x14 {
  virtual void  abc(); // _ZN3ccc8FF1x14y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y03pqrEv
  ~FF1x14y0(); // tgen
  FF1x14y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y0E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y03abcEv");}
void  ccc::FF1x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y03efgEv");}
void  ccc::FF1x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y03pqrEv");}
ccc::FF1x14y0 ::~FF1x14y0(){ note_dtor("_ZN3ccc8FF1x14y0E", this);} // tgen
ccc::FF1x14y0 ::FF1x14y0(){ note_ctor("_ZN3ccc8FF1x14y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y0E, buf);
    ::ccc::FF1x14y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y0E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y0E);
    dp->::ccc::FF1x14y0::~FF1x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y0E(Test__ZN3ccc8FF1x14y0E, "_ZN3ccc8FF1x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y0C1Ev();
extern void _ZN3ccc8FF1x14y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y0E[] = {
  NSPAIR(_ZN3ccc8FF1x14y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y0E[];
extern void _ZN3ccc8FF1x14y03abcEv();
extern void _ZN3ccc8FF1x14y03pqrEv();
extern void _ZN3ccc8FF1x14y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y0E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y0E[] = {
  {&(_ZTVN3ccc8FF1x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y0E[];
static VTBL_ENTRY alt_thunk_names465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y0E = {  "_ZN3ccc8FF1x14y0E", // class name
  bases__ZN3ccc8FF1x14y0E, 2,
  &(vtc__ZN3ccc8FF1x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names465,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y1  : virtual ::ccc::EE1x14 {
  virtual void  abc(); // _ZN3ccc8FF1x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x14y13efgEv
  ~FF1x14y1(); // tgen
  FF1x14y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y1E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y13abcEv");}
void  ccc::FF1x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y13pqrEv");}
void  ccc::FF1x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y13efgEv");}
ccc::FF1x14y1 ::~FF1x14y1(){ note_dtor("_ZN3ccc8FF1x14y1E", this);} // tgen
ccc::FF1x14y1 ::FF1x14y1(){ note_ctor("_ZN3ccc8FF1x14y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y1E, buf);
    ::ccc::FF1x14y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y1E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y1E);
    dp->::ccc::FF1x14y1::~FF1x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y1E(Test__ZN3ccc8FF1x14y1E, "_ZN3ccc8FF1x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y1C1Ev();
extern void _ZN3ccc8FF1x14y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y1E[] = {
  NSPAIR(_ZN3ccc8FF1x14y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y1E[];
extern void _ZN3ccc8FF1x14y13abcEv();
extern void _ZN3ccc8FF1x14y13pqrEv();
extern void _ZN3ccc8FF1x14y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y1E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y1E[] = {
  {&(_ZTVN3ccc8FF1x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y1E[];
static VTBL_ENTRY alt_thunk_names466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y1E = {  "_ZN3ccc8FF1x14y1E", // class name
  bases__ZN3ccc8FF1x14y1E, 2,
  &(vtc__ZN3ccc8FF1x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names466,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y2  : virtual ::ccc::EE1x14 {
  virtual void  efg(); // _ZN3ccc8FF1x14y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y23pqrEv
  ~FF1x14y2(); // tgen
  FF1x14y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y2E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y23efgEv");}
void  ccc::FF1x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y23abcEv");}
void  ccc::FF1x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y23pqrEv");}
ccc::FF1x14y2 ::~FF1x14y2(){ note_dtor("_ZN3ccc8FF1x14y2E", this);} // tgen
ccc::FF1x14y2 ::FF1x14y2(){ note_ctor("_ZN3ccc8FF1x14y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y2E, buf);
    ::ccc::FF1x14y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y2E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y2E);
    dp->::ccc::FF1x14y2::~FF1x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y2E(Test__ZN3ccc8FF1x14y2E, "_ZN3ccc8FF1x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y2C1Ev();
extern void _ZN3ccc8FF1x14y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y2E[] = {
  NSPAIR(_ZN3ccc8FF1x14y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y2E[];
extern void _ZN3ccc8FF1x14y23abcEv();
extern void _ZN3ccc8FF1x14y23pqrEv();
extern void _ZN3ccc8FF1x14y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y2E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y2E[] = {
  {&(_ZTVN3ccc8FF1x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y2E[];
static VTBL_ENTRY alt_thunk_names467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y2E = {  "_ZN3ccc8FF1x14y2E", // class name
  bases__ZN3ccc8FF1x14y2E, 2,
  &(vtc__ZN3ccc8FF1x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names467,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y3  : virtual ::ccc::EE1x14 {
  virtual void  efg(); // _ZN3ccc8FF1x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x14y33abcEv
  ~FF1x14y3(); // tgen
  FF1x14y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y3E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y33efgEv");}
void  ccc::FF1x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y33pqrEv");}
void  ccc::FF1x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y33abcEv");}
ccc::FF1x14y3 ::~FF1x14y3(){ note_dtor("_ZN3ccc8FF1x14y3E", this);} // tgen
ccc::FF1x14y3 ::FF1x14y3(){ note_ctor("_ZN3ccc8FF1x14y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y3E, buf);
    ::ccc::FF1x14y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y3E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y3E);
    dp->::ccc::FF1x14y3::~FF1x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y3E(Test__ZN3ccc8FF1x14y3E, "_ZN3ccc8FF1x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y3C1Ev();
extern void _ZN3ccc8FF1x14y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y3E[] = {
  NSPAIR(_ZN3ccc8FF1x14y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y3E[];
extern void _ZN3ccc8FF1x14y33abcEv();
extern void _ZN3ccc8FF1x14y33pqrEv();
extern void _ZN3ccc8FF1x14y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y3E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y3E[] = {
  {&(_ZTVN3ccc8FF1x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y3E[];
static VTBL_ENTRY alt_thunk_names468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y3E = {  "_ZN3ccc8FF1x14y3E", // class name
  bases__ZN3ccc8FF1x14y3E, 2,
  &(vtc__ZN3ccc8FF1x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names468,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y4  : virtual ::ccc::EE1x14 {
  virtual void  pqr(); // _ZN3ccc8FF1x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x14y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x14y43efgEv
  ~FF1x14y4(); // tgen
  FF1x14y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y4E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y43pqrEv");}
void  ccc::FF1x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y43abcEv");}
void  ccc::FF1x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y43efgEv");}
ccc::FF1x14y4 ::~FF1x14y4(){ note_dtor("_ZN3ccc8FF1x14y4E", this);} // tgen
ccc::FF1x14y4 ::FF1x14y4(){ note_ctor("_ZN3ccc8FF1x14y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y4E, buf);
    ::ccc::FF1x14y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y4E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y4E);
    dp->::ccc::FF1x14y4::~FF1x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y4E(Test__ZN3ccc8FF1x14y4E, "_ZN3ccc8FF1x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y4C1Ev();
extern void _ZN3ccc8FF1x14y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y4E[] = {
  NSPAIR(_ZN3ccc8FF1x14y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y4E[];
extern void _ZN3ccc8FF1x14y43abcEv();
extern void _ZN3ccc8FF1x14y43pqrEv();
extern void _ZN3ccc8FF1x14y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y4E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y4E[] = {
  {&(_ZTVN3ccc8FF1x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y4E[];
static VTBL_ENTRY alt_thunk_names469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y4E = {  "_ZN3ccc8FF1x14y4E", // class name
  bases__ZN3ccc8FF1x14y4E, 2,
  &(vtc__ZN3ccc8FF1x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names469,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y5  : virtual ::ccc::EE1x14 {
  virtual void  pqr(); // _ZN3ccc8FF1x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x14y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x14y53abcEv
  ~FF1x14y5(); // tgen
  FF1x14y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y5E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y53pqrEv");}
void  ccc::FF1x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y53efgEv");}
void  ccc::FF1x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y53abcEv");}
ccc::FF1x14y5 ::~FF1x14y5(){ note_dtor("_ZN3ccc8FF1x14y5E", this);} // tgen
ccc::FF1x14y5 ::FF1x14y5(){ note_ctor("_ZN3ccc8FF1x14y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y5E, buf);
    ::ccc::FF1x14y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y5E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y5E);
    dp->::ccc::FF1x14y5::~FF1x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y5E(Test__ZN3ccc8FF1x14y5E, "_ZN3ccc8FF1x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y5C1Ev();
extern void _ZN3ccc8FF1x14y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y5E[] = {
  NSPAIR(_ZN3ccc8FF1x14y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y5E[];
extern void _ZN3ccc8FF1x14y53abcEv();
extern void _ZN3ccc8FF1x14y53pqrEv();
extern void _ZN3ccc8FF1x14y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y5E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y5E[] = {
  {&(_ZTVN3ccc8FF1x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y5E[];
static VTBL_ENTRY alt_thunk_names470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y5E = {  "_ZN3ccc8FF1x14y5E", // class name
  bases__ZN3ccc8FF1x14y5E, 2,
  &(vtc__ZN3ccc8FF1x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names470,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y6  : virtual ::ccc::EE1x14 {
  virtual void  abc(); // _ZN3ccc8FF1x14y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x14y63efgEv
  ~FF1x14y6(); // tgen
  FF1x14y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y6E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y63abcEv");}
void  ccc::FF1x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y63efgEv");}
ccc::FF1x14y6 ::~FF1x14y6(){ note_dtor("_ZN3ccc8FF1x14y6E", this);} // tgen
ccc::FF1x14y6 ::FF1x14y6(){ note_ctor("_ZN3ccc8FF1x14y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y6E, buf);
    ::ccc::FF1x14y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y6E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y6E);
    dp->::ccc::FF1x14y6::~FF1x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y6E(Test__ZN3ccc8FF1x14y6E, "_ZN3ccc8FF1x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y6C1Ev();
extern void _ZN3ccc8FF1x14y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y6E[] = {
  NSPAIR(_ZN3ccc8FF1x14y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y6E[];
extern void _ZN3ccc8FF1x14y63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x14y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y6E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y6E[] = {
  {&(_ZTVN3ccc8FF1x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y6E[];
static VTBL_ENTRY alt_thunk_names471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y6E = {  "_ZN3ccc8FF1x14y6E", // class name
  bases__ZN3ccc8FF1x14y6E, 2,
  &(vtc__ZN3ccc8FF1x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names471,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y7  : virtual ::ccc::EE1x14 {
  virtual void  abc(); // _ZN3ccc8FF1x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y73pqrEv
  ~FF1x14y7(); // tgen
  FF1x14y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y7E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y73abcEv");}
void  ccc::FF1x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y73pqrEv");}
ccc::FF1x14y7 ::~FF1x14y7(){ note_dtor("_ZN3ccc8FF1x14y7E", this);} // tgen
ccc::FF1x14y7 ::FF1x14y7(){ note_ctor("_ZN3ccc8FF1x14y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y7E, buf);
    ::ccc::FF1x14y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y7E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y7E);
    dp->::ccc::FF1x14y7::~FF1x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y7E(Test__ZN3ccc8FF1x14y7E, "_ZN3ccc8FF1x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y7C1Ev();
extern void _ZN3ccc8FF1x14y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y7E[] = {
  NSPAIR(_ZN3ccc8FF1x14y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y7E[];
extern void _ZN3ccc8FF1x14y73abcEv();
extern void _ZN3ccc8FF1x14y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y7E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y7E[] = {
  {&(_ZTVN3ccc8FF1x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y7E[];
static VTBL_ENTRY alt_thunk_names472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y7E = {  "_ZN3ccc8FF1x14y7E", // class name
  bases__ZN3ccc8FF1x14y7E, 2,
  &(vtc__ZN3ccc8FF1x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names472,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y8  : virtual ::ccc::EE1x14 {
  virtual void  efg(); // _ZN3ccc8FF1x14y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x14y83abcEv
  ~FF1x14y8(); // tgen
  FF1x14y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y8E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y83efgEv");}
void  ccc::FF1x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x14y83abcEv");}
ccc::FF1x14y8 ::~FF1x14y8(){ note_dtor("_ZN3ccc8FF1x14y8E", this);} // tgen
ccc::FF1x14y8 ::FF1x14y8(){ note_ctor("_ZN3ccc8FF1x14y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y8E, buf);
    ::ccc::FF1x14y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y8E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y8E);
    dp->::ccc::FF1x14y8::~FF1x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y8E(Test__ZN3ccc8FF1x14y8E, "_ZN3ccc8FF1x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y8C1Ev();
extern void _ZN3ccc8FF1x14y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y8E[] = {
  NSPAIR(_ZN3ccc8FF1x14y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y8E[];
extern void _ZN3ccc8FF1x14y83abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF1x14y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y8E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y8E[] = {
  {&(_ZTVN3ccc8FF1x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y8E[];
static VTBL_ENTRY alt_thunk_names473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y8E = {  "_ZN3ccc8FF1x14y8E", // class name
  bases__ZN3ccc8FF1x14y8E, 2,
  &(vtc__ZN3ccc8FF1x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names473,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y9  : virtual ::ccc::EE1x14 {
  virtual void  efg(); // _ZN3ccc8FF1x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x14y93pqrEv
  ~FF1x14y9(); // tgen
  FF1x14y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x14y9E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x14y93efgEv");}
void  ccc::FF1x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x14y93pqrEv");}
ccc::FF1x14y9 ::~FF1x14y9(){ note_dtor("_ZN3ccc8FF1x14y9E", this);} // tgen
ccc::FF1x14y9 ::FF1x14y9(){ note_ctor("_ZN3ccc8FF1x14y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x14y9E, buf);
    ::ccc::FF1x14y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x14y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y9E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc8FF1x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x14y9E);
    dp->::ccc::FF1x14y9::~FF1x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x14y9E(Test__ZN3ccc8FF1x14y9E, "_ZN3ccc8FF1x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x14y9C1Ev();
extern void _ZN3ccc8FF1x14y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x14y9E[] = {
  NSPAIR(_ZN3ccc8FF1x14y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc8FF1x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x14y93pqrEv();
extern void _ZN3ccc8FF1x14y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x14y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x14y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x14y9E[] = {
  {&(_ZTVN3ccc8FF1x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x14y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_8FF1x14y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x14y9E[];
static VTBL_ENTRY alt_thunk_names474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF1x14y9E = {  "_ZN3ccc8FF1x14y9E", // class name
  bases__ZN3ccc8FF1x14y9E, 2,
  &(vtc__ZN3ccc8FF1x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x14y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x14y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x14y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x14y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names474,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y10  : virtual ::ccc::EE1x14 {
  virtual void  pqr(); // _ZN3ccc9FF1x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x14y103abcEv
  ~FF1x14y10(); // tgen
  FF1x14y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y10E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x14y103pqrEv");}
void  ccc::FF1x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x14y103abcEv");}
ccc::FF1x14y10 ::~FF1x14y10(){ note_dtor("_ZN3ccc9FF1x14y10E", this);} // tgen
ccc::FF1x14y10 ::FF1x14y10(){ note_ctor("_ZN3ccc9FF1x14y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y10E, buf);
    ::ccc::FF1x14y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y10E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y10E);
    dp->::ccc::FF1x14y10::~FF1x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y10E(Test__ZN3ccc9FF1x14y10E, "_ZN3ccc9FF1x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y10C1Ev();
extern void _ZN3ccc9FF1x14y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y10E[] = {
  NSPAIR(_ZN3ccc9FF1x14y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y10E[];
extern void _ZN3ccc9FF1x14y103abcEv();
extern void _ZN3ccc9FF1x14y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y10E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y10E[] = {
  {&(_ZTVN3ccc9FF1x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y10E[];
static VTBL_ENTRY alt_thunk_names475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y10E = {  "_ZN3ccc9FF1x14y10E", // class name
  bases__ZN3ccc9FF1x14y10E, 2,
  &(vtc__ZN3ccc9FF1x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names475,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y11  : virtual ::ccc::EE1x14 {
  virtual void  pqr(); // _ZN3ccc9FF1x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x14y113efgEv
  ~FF1x14y11(); // tgen
  FF1x14y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y11E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF1x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x14y113pqrEv");}
void  ccc::FF1x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x14y113efgEv");}
ccc::FF1x14y11 ::~FF1x14y11(){ note_dtor("_ZN3ccc9FF1x14y11E", this);} // tgen
ccc::FF1x14y11 ::FF1x14y11(){ note_ctor("_ZN3ccc9FF1x14y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y11E, buf);
    ::ccc::FF1x14y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y11E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y11E);
    dp->::ccc::FF1x14y11::~FF1x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y11E(Test__ZN3ccc9FF1x14y11E, "_ZN3ccc9FF1x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y11C1Ev();
extern void _ZN3ccc9FF1x14y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y11E[] = {
  NSPAIR(_ZN3ccc9FF1x14y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x14y113pqrEv();
extern void _ZN3ccc9FF1x14y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y11E[] = {
  {&(_ZTVN3ccc9FF1x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y11E[];
static VTBL_ENTRY alt_thunk_names476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y11E = {  "_ZN3ccc9FF1x14y11E", // class name
  bases__ZN3ccc9FF1x14y11E, 2,
  &(vtc__ZN3ccc9FF1x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names476,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y12  : virtual ::ccc::EE1x14 {
  virtual void  abc(); // _ZN3ccc9FF1x14y123abcEv
  ~FF1x14y12(); // tgen
  FF1x14y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y12E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF1x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x14y123abcEv");}
ccc::FF1x14y12 ::~FF1x14y12(){ note_dtor("_ZN3ccc9FF1x14y12E", this);} // tgen
ccc::FF1x14y12 ::FF1x14y12(){ note_ctor("_ZN3ccc9FF1x14y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y12E, buf);
    ::ccc::FF1x14y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y12E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y12E);
    dp->::ccc::FF1x14y12::~FF1x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y12E(Test__ZN3ccc9FF1x14y12E, "_ZN3ccc9FF1x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y12C1Ev();
extern void _ZN3ccc9FF1x14y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y12E[] = {
  NSPAIR(_ZN3ccc9FF1x14y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y12E[];
extern void _ZN3ccc9FF1x14y123abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y12E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y12E[] = {
  {&(_ZTVN3ccc9FF1x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y12E[];
static VTBL_ENTRY alt_thunk_names477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y12E = {  "_ZN3ccc9FF1x14y12E", // class name
  bases__ZN3ccc9FF1x14y12E, 2,
  &(vtc__ZN3ccc9FF1x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names477,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y13  : virtual ::ccc::EE1x14 {
  virtual void  efg(); // _ZN3ccc9FF1x14y133efgEv
  ~FF1x14y13(); // tgen
  FF1x14y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF1x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x14y133efgEv");}
ccc::FF1x14y13 ::~FF1x14y13(){ note_dtor("_ZN3ccc9FF1x14y13E", this);} // tgen
ccc::FF1x14y13 ::FF1x14y13(){ note_ctor("_ZN3ccc9FF1x14y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y13E, buf);
    ::ccc::FF1x14y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y13E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y13E);
    dp->::ccc::FF1x14y13::~FF1x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y13E(Test__ZN3ccc9FF1x14y13E, "_ZN3ccc9FF1x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y13C1Ev();
extern void _ZN3ccc9FF1x14y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y13E[] = {
  NSPAIR(_ZN3ccc9FF1x14y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF1x14y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y13E[] = {
  {&(_ZTVN3ccc9FF1x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y13E[];
static VTBL_ENTRY alt_thunk_names478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y13E = {  "_ZN3ccc9FF1x14y13E", // class name
  bases__ZN3ccc9FF1x14y13E, 2,
  &(vtc__ZN3ccc9FF1x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names478,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y14  : virtual ::ccc::EE1x14 {
  virtual void  pqr(); // _ZN3ccc9FF1x14y143pqrEv
  ~FF1x14y14(); // tgen
  FF1x14y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF1x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x14y143pqrEv");}
ccc::FF1x14y14 ::~FF1x14y14(){ note_dtor("_ZN3ccc9FF1x14y14E", this);} // tgen
ccc::FF1x14y14 ::FF1x14y14(){ note_ctor("_ZN3ccc9FF1x14y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y14E, buf);
    ::ccc::FF1x14y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y14E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y14E);
    dp->::ccc::FF1x14y14::~FF1x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y14E(Test__ZN3ccc9FF1x14y14E, "_ZN3ccc9FF1x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y14C1Ev();
extern void _ZN3ccc9FF1x14y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y14E[] = {
  NSPAIR(_ZN3ccc9FF1x14y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x14y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y14E[] = {
  {&(_ZTVN3ccc9FF1x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y14E[];
static VTBL_ENTRY alt_thunk_names479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y14E = {  "_ZN3ccc9FF1x14y14E", // class name
  bases__ZN3ccc9FF1x14y14E, 2,
  &(vtc__ZN3ccc9FF1x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names479,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x14y15  : virtual ::ccc::EE1x14 {
  ~FF1x14y15(); // tgen
  FF1x14y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x14y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1}}
}
namespace ccc { 
ccc::FF1x14y15 ::~FF1x14y15(){ note_dtor("_ZN3ccc9FF1x14y15E", this);} // tgen
ccc::FF1x14y15 ::FF1x14y15(){ note_ctor("_ZN3ccc9FF1x14y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x14y15E, buf);
    ::ccc::FF1x14y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x14y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y15E");
    check_base_class_offset(lv, (::ccc::EE1x14*), 0, "_ZN3ccc9FF1x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x14y15E);
    dp->::ccc::FF1x14y15::~FF1x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x14y15E(Test__ZN3ccc9FF1x14y15E, "_ZN3ccc9FF1x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x14y15C1Ev();
extern void _ZN3ccc9FF1x14y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x14y15E[] = {
  NSPAIR(_ZN3ccc9FF1x14y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x14E[];
static Base_Class bases__ZN3ccc9FF1x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x14y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv)();
extern void _ZN3ccc6EE1x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x14y15E[] = {
  {&(_ZTVN3ccc9FF1x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x14y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x14E__NS_9FF1x14y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x14y15E[];
static VTBL_ENTRY alt_thunk_names480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE1x143pqrEv,_ZTv0_n16_N3ccc6EE1x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE1x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF1x14y15E = {  "_ZN3ccc9FF1x14y15E", // class name
  bases__ZN3ccc9FF1x14y15E, 2,
  &(vtc__ZN3ccc9FF1x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x14y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x14y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x14y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x14y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names480,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF1x15y0  : virtual ::ccc::EE1x15 {
  virtual void  abc(); // _ZN3ccc8FF1x15y03abcEv
  virtual void  efg(); // _ZN3ccc8FF1x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y03pqrEv
  ~FF1x15y0(); // tgen
  FF1x15y0(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y0E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y03abcEv");}
void  ccc::FF1x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y03efgEv");}
void  ccc::FF1x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y03pqrEv");}
ccc::FF1x15y0 ::~FF1x15y0(){ note_dtor("_ZN3ccc8FF1x15y0E", this);} // tgen
ccc::FF1x15y0 ::FF1x15y0(){ note_ctor("_ZN3ccc8FF1x15y0E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y0E, buf);
    ::ccc::FF1x15y0 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y0E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y0E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y0E);
    dp->::ccc::FF1x15y0::~FF1x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y0E(Test__ZN3ccc8FF1x15y0E, "_ZN3ccc8FF1x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y0C1Ev();
extern void _ZN3ccc8FF1x15y0D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y0E[] = {
  NSPAIR(_ZN3ccc8FF1x15y0C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y0E[];
extern void _ZN3ccc8FF1x15y03abcEv();
extern void _ZN3ccc8FF1x15y03pqrEv();
extern void _ZN3ccc8FF1x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y0E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y0E[] = {
  {&(_ZTVN3ccc8FF1x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y0E[];
Class_Descriptor cd__ZN3ccc8FF1x15y0E = {  "_ZN3ccc8FF1x15y0E", // class name
  bases__ZN3ccc8FF1x15y0E, 2,
  &(vtc__ZN3ccc8FF1x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y0E),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
namespace ccc { 
struct  FF1x15y1  : virtual ::ccc::EE1x15 {
  virtual void  abc(); // _ZN3ccc8FF1x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x15y13efgEv
  ~FF1x15y1(); // tgen
  FF1x15y1(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y1E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y13abcEv");}
void  ccc::FF1x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y13pqrEv");}
void  ccc::FF1x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y13efgEv");}
ccc::FF1x15y1 ::~FF1x15y1(){ note_dtor("_ZN3ccc8FF1x15y1E", this);} // tgen
ccc::FF1x15y1 ::FF1x15y1(){ note_ctor("_ZN3ccc8FF1x15y1E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y1E, buf);
    ::ccc::FF1x15y1 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y1E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y1E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y1E);
    dp->::ccc::FF1x15y1::~FF1x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y1E(Test__ZN3ccc8FF1x15y1E, "_ZN3ccc8FF1x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y1C1Ev();
extern void _ZN3ccc8FF1x15y1D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y1E[] = {
  NSPAIR(_ZN3ccc8FF1x15y1C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y1E[];
extern void _ZN3ccc8FF1x15y13abcEv();
extern void _ZN3ccc8FF1x15y13pqrEv();
extern void _ZN3ccc8FF1x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y1E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y1E[] = {
  {&(_ZTVN3ccc8FF1x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y1E[];
Class_Descriptor cd__ZN3ccc8FF1x15y1E = {  "_ZN3ccc8FF1x15y1E", // class name
  bases__ZN3ccc8FF1x15y1E, 2,
  &(vtc__ZN3ccc8FF1x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y1E),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
namespace ccc { 
struct  FF1x15y2  : virtual ::ccc::EE1x15 {
  virtual void  efg(); // _ZN3ccc8FF1x15y23efgEv
  virtual void  abc(); // _ZN3ccc8FF1x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y23pqrEv
  ~FF1x15y2(); // tgen
  FF1x15y2(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y2E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y23efgEv");}
void  ccc::FF1x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y23abcEv");}
void  ccc::FF1x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y23pqrEv");}
ccc::FF1x15y2 ::~FF1x15y2(){ note_dtor("_ZN3ccc8FF1x15y2E", this);} // tgen
ccc::FF1x15y2 ::FF1x15y2(){ note_ctor("_ZN3ccc8FF1x15y2E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y2E, buf);
    ::ccc::FF1x15y2 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y2E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y2E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y2E);
    dp->::ccc::FF1x15y2::~FF1x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y2E(Test__ZN3ccc8FF1x15y2E, "_ZN3ccc8FF1x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y2C1Ev();
extern void _ZN3ccc8FF1x15y2D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y2E[] = {
  NSPAIR(_ZN3ccc8FF1x15y2C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y2E[];
extern void _ZN3ccc8FF1x15y23abcEv();
extern void _ZN3ccc8FF1x15y23pqrEv();
extern void _ZN3ccc8FF1x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y2E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y2E[] = {
  {&(_ZTVN3ccc8FF1x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y2E[];
Class_Descriptor cd__ZN3ccc8FF1x15y2E = {  "_ZN3ccc8FF1x15y2E", // class name
  bases__ZN3ccc8FF1x15y2E, 2,
  &(vtc__ZN3ccc8FF1x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y2E),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
namespace ccc { 
struct  FF1x15y3  : virtual ::ccc::EE1x15 {
  virtual void  efg(); // _ZN3ccc8FF1x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x15y33abcEv
  ~FF1x15y3(); // tgen
  FF1x15y3(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y3E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y33efgEv");}
void  ccc::FF1x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y33pqrEv");}
void  ccc::FF1x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y33abcEv");}
ccc::FF1x15y3 ::~FF1x15y3(){ note_dtor("_ZN3ccc8FF1x15y3E", this);} // tgen
ccc::FF1x15y3 ::FF1x15y3(){ note_ctor("_ZN3ccc8FF1x15y3E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y3E, buf);
    ::ccc::FF1x15y3 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y3E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y3E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y3E);
    dp->::ccc::FF1x15y3::~FF1x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y3E(Test__ZN3ccc8FF1x15y3E, "_ZN3ccc8FF1x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y3C1Ev();
extern void _ZN3ccc8FF1x15y3D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y3E[] = {
  NSPAIR(_ZN3ccc8FF1x15y3C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y3E[];
extern void _ZN3ccc8FF1x15y33abcEv();
extern void _ZN3ccc8FF1x15y33pqrEv();
extern void _ZN3ccc8FF1x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y3E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y3E[] = {
  {&(_ZTVN3ccc8FF1x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y3E[];
Class_Descriptor cd__ZN3ccc8FF1x15y3E = {  "_ZN3ccc8FF1x15y3E", // class name
  bases__ZN3ccc8FF1x15y3E, 2,
  &(vtc__ZN3ccc8FF1x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y3E),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
namespace ccc { 
struct  FF1x15y4  : virtual ::ccc::EE1x15 {
  virtual void  pqr(); // _ZN3ccc8FF1x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF1x15y43abcEv
  virtual void  efg(); // _ZN3ccc8FF1x15y43efgEv
  ~FF1x15y4(); // tgen
  FF1x15y4(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y4E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y43pqrEv");}
void  ccc::FF1x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y43abcEv");}
void  ccc::FF1x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y43efgEv");}
ccc::FF1x15y4 ::~FF1x15y4(){ note_dtor("_ZN3ccc8FF1x15y4E", this);} // tgen
ccc::FF1x15y4 ::FF1x15y4(){ note_ctor("_ZN3ccc8FF1x15y4E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y4E, buf);
    ::ccc::FF1x15y4 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y4E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y4E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y4E);
    dp->::ccc::FF1x15y4::~FF1x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y4E(Test__ZN3ccc8FF1x15y4E, "_ZN3ccc8FF1x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y4C1Ev();
extern void _ZN3ccc8FF1x15y4D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y4E[] = {
  NSPAIR(_ZN3ccc8FF1x15y4C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y4E[];
extern void _ZN3ccc8FF1x15y43abcEv();
extern void _ZN3ccc8FF1x15y43pqrEv();
extern void _ZN3ccc8FF1x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y4E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y4E[] = {
  {&(_ZTVN3ccc8FF1x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y4E[];
Class_Descriptor cd__ZN3ccc8FF1x15y4E = {  "_ZN3ccc8FF1x15y4E", // class name
  bases__ZN3ccc8FF1x15y4E, 2,
  &(vtc__ZN3ccc8FF1x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y4E),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
namespace ccc { 
struct  FF1x15y5  : virtual ::ccc::EE1x15 {
  virtual void  pqr(); // _ZN3ccc8FF1x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF1x15y53efgEv
  virtual void  abc(); // _ZN3ccc8FF1x15y53abcEv
  ~FF1x15y5(); // tgen
  FF1x15y5(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y5E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF1x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y53pqrEv");}
void  ccc::FF1x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y53efgEv");}
void  ccc::FF1x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y53abcEv");}
ccc::FF1x15y5 ::~FF1x15y5(){ note_dtor("_ZN3ccc8FF1x15y5E", this);} // tgen
ccc::FF1x15y5 ::FF1x15y5(){ note_ctor("_ZN3ccc8FF1x15y5E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y5E, buf);
    ::ccc::FF1x15y5 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y5E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y5E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y5E);
    dp->::ccc::FF1x15y5::~FF1x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y5E(Test__ZN3ccc8FF1x15y5E, "_ZN3ccc8FF1x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y5C1Ev();
extern void _ZN3ccc8FF1x15y5D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y5E[] = {
  NSPAIR(_ZN3ccc8FF1x15y5C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y5E[];
extern void _ZN3ccc8FF1x15y53abcEv();
extern void _ZN3ccc8FF1x15y53pqrEv();
extern void _ZN3ccc8FF1x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y5E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y5E[] = {
  {&(_ZTVN3ccc8FF1x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y5E[];
Class_Descriptor cd__ZN3ccc8FF1x15y5E = {  "_ZN3ccc8FF1x15y5E", // class name
  bases__ZN3ccc8FF1x15y5E, 2,
  &(vtc__ZN3ccc8FF1x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y5E),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
namespace ccc { 
struct  FF1x15y6  : virtual ::ccc::EE1x15 {
  virtual void  abc(); // _ZN3ccc8FF1x15y63abcEv
  virtual void  efg(); // _ZN3ccc8FF1x15y63efgEv
  ~FF1x15y6(); // tgen
  FF1x15y6(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y6E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y63abcEv");}
void  ccc::FF1x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y63efgEv");}
ccc::FF1x15y6 ::~FF1x15y6(){ note_dtor("_ZN3ccc8FF1x15y6E", this);} // tgen
ccc::FF1x15y6 ::FF1x15y6(){ note_ctor("_ZN3ccc8FF1x15y6E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y6E, buf);
    ::ccc::FF1x15y6 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y6E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y6E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y6E);
    dp->::ccc::FF1x15y6::~FF1x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y6E(Test__ZN3ccc8FF1x15y6E, "_ZN3ccc8FF1x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y6C1Ev();
extern void _ZN3ccc8FF1x15y6D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y6E[] = {
  NSPAIR(_ZN3ccc8FF1x15y6C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y6E[];
extern void _ZN3ccc8FF1x15y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y6E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y6E[] = {
  {&(_ZTVN3ccc8FF1x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y6E[];
Class_Descriptor cd__ZN3ccc8FF1x15y6E = {  "_ZN3ccc8FF1x15y6E", // class name
  bases__ZN3ccc8FF1x15y6E, 2,
  &(vtc__ZN3ccc8FF1x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y6E),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
namespace ccc { 
struct  FF1x15y7  : virtual ::ccc::EE1x15 {
  virtual void  abc(); // _ZN3ccc8FF1x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y73pqrEv
  ~FF1x15y7(); // tgen
  FF1x15y7(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y7E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y73abcEv");}
void  ccc::FF1x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y73pqrEv");}
ccc::FF1x15y7 ::~FF1x15y7(){ note_dtor("_ZN3ccc8FF1x15y7E", this);} // tgen
ccc::FF1x15y7 ::FF1x15y7(){ note_ctor("_ZN3ccc8FF1x15y7E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y7E, buf);
    ::ccc::FF1x15y7 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y7E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y7E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y7E);
    dp->::ccc::FF1x15y7::~FF1x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y7E(Test__ZN3ccc8FF1x15y7E, "_ZN3ccc8FF1x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y7C1Ev();
extern void _ZN3ccc8FF1x15y7D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y7E[] = {
  NSPAIR(_ZN3ccc8FF1x15y7C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y7E[];
extern void _ZN3ccc8FF1x15y73abcEv();
extern void _ZN3ccc8FF1x15y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y7E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y7E[] = {
  {&(_ZTVN3ccc8FF1x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y7E[];
Class_Descriptor cd__ZN3ccc8FF1x15y7E = {  "_ZN3ccc8FF1x15y7E", // class name
  bases__ZN3ccc8FF1x15y7E, 2,
  &(vtc__ZN3ccc8FF1x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y7E),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
namespace ccc { 
struct  FF1x15y8  : virtual ::ccc::EE1x15 {
  virtual void  efg(); // _ZN3ccc8FF1x15y83efgEv
  virtual void  abc(); // _ZN3ccc8FF1x15y83abcEv
  ~FF1x15y8(); // tgen
  FF1x15y8(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y8E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y83efgEv");}
void  ccc::FF1x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF1x15y83abcEv");}
ccc::FF1x15y8 ::~FF1x15y8(){ note_dtor("_ZN3ccc8FF1x15y8E", this);} // tgen
ccc::FF1x15y8 ::FF1x15y8(){ note_ctor("_ZN3ccc8FF1x15y8E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y8E, buf);
    ::ccc::FF1x15y8 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y8E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y8E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y8E);
    dp->::ccc::FF1x15y8::~FF1x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y8E(Test__ZN3ccc8FF1x15y8E, "_ZN3ccc8FF1x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y8C1Ev();
extern void _ZN3ccc8FF1x15y8D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y8E[] = {
  NSPAIR(_ZN3ccc8FF1x15y8C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y8E[];
extern void _ZN3ccc8FF1x15y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8FF1x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y8E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y8E[] = {
  {&(_ZTVN3ccc8FF1x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y8E[];
Class_Descriptor cd__ZN3ccc8FF1x15y8E = {  "_ZN3ccc8FF1x15y8E", // class name
  bases__ZN3ccc8FF1x15y8E, 2,
  &(vtc__ZN3ccc8FF1x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y8E),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
namespace ccc { 
struct  FF1x15y9  : virtual ::ccc::EE1x15 {
  virtual void  efg(); // _ZN3ccc8FF1x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF1x15y93pqrEv
  ~FF1x15y9(); // tgen
  FF1x15y9(); // tgen
};
//SIG(1 _ZN3ccc8FF1x15y9E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF1x15y93efgEv");}
void  ccc::FF1x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF1x15y93pqrEv");}
ccc::FF1x15y9 ::~FF1x15y9(){ note_dtor("_ZN3ccc8FF1x15y9E", this);} // tgen
ccc::FF1x15y9 ::FF1x15y9(){ note_ctor("_ZN3ccc8FF1x15y9E", this);} // tgen
}
static void Test__ZN3ccc8FF1x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF1x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF1x15y9E, buf);
    ::ccc::FF1x15y9 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF1x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF1x15y9E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y9E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc8FF1x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF1x15y9E);
    dp->::ccc::FF1x15y9::~FF1x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF1x15y9E(Test__ZN3ccc8FF1x15y9E, "_ZN3ccc8FF1x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF1x15y9C1Ev();
extern void _ZN3ccc8FF1x15y9D1Ev();
Name_Map name_map__ZN3ccc8FF1x15y9E[] = {
  NSPAIR(_ZN3ccc8FF1x15y9C1Ev),
  NSPAIR(_ZN3ccc8FF1x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc8FF1x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8FF1x15y93pqrEv();
extern void _ZN3ccc8FF1x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF1x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF1x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF1x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF1x15y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF1x15y9E[] = {
  {&(_ZTVN3ccc8FF1x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF1x15y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_8FF1x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF1x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF1x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF1x15y9E[];
Class_Descriptor cd__ZN3ccc8FF1x15y9E = {  "_ZN3ccc8FF1x15y9E", // class name
  bases__ZN3ccc8FF1x15y9E, 2,
  &(vtc__ZN3ccc8FF1x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF1x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF1x15y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF1x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF1x15y9E),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
namespace ccc { 
struct  FF1x15y10  : virtual ::ccc::EE1x15 {
  virtual void  pqr(); // _ZN3ccc9FF1x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF1x15y103abcEv
  ~FF1x15y10(); // tgen
  FF1x15y10(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y10E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x15y103pqrEv");}
void  ccc::FF1x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x15y103abcEv");}
ccc::FF1x15y10 ::~FF1x15y10(){ note_dtor("_ZN3ccc9FF1x15y10E", this);} // tgen
ccc::FF1x15y10 ::FF1x15y10(){ note_ctor("_ZN3ccc9FF1x15y10E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y10E, buf);
    ::ccc::FF1x15y10 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y10E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y10E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y10E);
    dp->::ccc::FF1x15y10::~FF1x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y10E(Test__ZN3ccc9FF1x15y10E, "_ZN3ccc9FF1x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y10C1Ev();
extern void _ZN3ccc9FF1x15y10D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y10E[] = {
  NSPAIR(_ZN3ccc9FF1x15y10C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y10E[];
extern void _ZN3ccc9FF1x15y103abcEv();
extern void _ZN3ccc9FF1x15y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y10E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y10E[] = {
  {&(_ZTVN3ccc9FF1x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y10E[];
Class_Descriptor cd__ZN3ccc9FF1x15y10E = {  "_ZN3ccc9FF1x15y10E", // class name
  bases__ZN3ccc9FF1x15y10E, 2,
  &(vtc__ZN3ccc9FF1x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y10E),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
namespace ccc { 
struct  FF1x15y11  : virtual ::ccc::EE1x15 {
  virtual void  pqr(); // _ZN3ccc9FF1x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF1x15y113efgEv
  ~FF1x15y11(); // tgen
  FF1x15y11(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y11E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF1x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x15y113pqrEv");}
void  ccc::FF1x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x15y113efgEv");}
ccc::FF1x15y11 ::~FF1x15y11(){ note_dtor("_ZN3ccc9FF1x15y11E", this);} // tgen
ccc::FF1x15y11 ::FF1x15y11(){ note_ctor("_ZN3ccc9FF1x15y11E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y11E, buf);
    ::ccc::FF1x15y11 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y11E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y11E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y11E);
    dp->::ccc::FF1x15y11::~FF1x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y11E(Test__ZN3ccc9FF1x15y11E, "_ZN3ccc9FF1x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y11C1Ev();
extern void _ZN3ccc9FF1x15y11D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y11E[] = {
  NSPAIR(_ZN3ccc9FF1x15y11C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x15y113pqrEv();
extern void _ZN3ccc9FF1x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y11E[] = {
  {&(_ZTVN3ccc9FF1x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y11E[];
Class_Descriptor cd__ZN3ccc9FF1x15y11E = {  "_ZN3ccc9FF1x15y11E", // class name
  bases__ZN3ccc9FF1x15y11E, 2,
  &(vtc__ZN3ccc9FF1x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y11E),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
namespace ccc { 
struct  FF1x15y12  : virtual ::ccc::EE1x15 {
  virtual void  abc(); // _ZN3ccc9FF1x15y123abcEv
  ~FF1x15y12(); // tgen
  FF1x15y12(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y12E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1}
}
namespace ccc { 
void  ccc::FF1x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF1x15y123abcEv");}
ccc::FF1x15y12 ::~FF1x15y12(){ note_dtor("_ZN3ccc9FF1x15y12E", this);} // tgen
ccc::FF1x15y12 ::FF1x15y12(){ note_ctor("_ZN3ccc9FF1x15y12E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y12E, buf);
    ::ccc::FF1x15y12 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y12E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y12E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y12E);
    dp->::ccc::FF1x15y12::~FF1x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y12E(Test__ZN3ccc9FF1x15y12E, "_ZN3ccc9FF1x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y12C1Ev();
extern void _ZN3ccc9FF1x15y12D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y12E[] = {
  NSPAIR(_ZN3ccc9FF1x15y12C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y12E[];
extern void _ZN3ccc9FF1x15y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y12E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y12E[] = {
  {&(_ZTVN3ccc9FF1x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y12E[];
Class_Descriptor cd__ZN3ccc9FF1x15y12E = {  "_ZN3ccc9FF1x15y12E", // class name
  bases__ZN3ccc9FF1x15y12E, 2,
  &(vtc__ZN3ccc9FF1x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y12E),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
namespace ccc { 
struct  FF1x15y13  : virtual ::ccc::EE1x15 {
  virtual void  efg(); // _ZN3ccc9FF1x15y133efgEv
  ~FF1x15y13(); // tgen
  FF1x15y13(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y13E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1}
}
namespace ccc { 
void  ccc::FF1x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF1x15y133efgEv");}
ccc::FF1x15y13 ::~FF1x15y13(){ note_dtor("_ZN3ccc9FF1x15y13E", this);} // tgen
ccc::FF1x15y13 ::FF1x15y13(){ note_ctor("_ZN3ccc9FF1x15y13E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y13E, buf);
    ::ccc::FF1x15y13 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y13E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y13E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y13E);
    dp->::ccc::FF1x15y13::~FF1x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y13E(Test__ZN3ccc9FF1x15y13E, "_ZN3ccc9FF1x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y13C1Ev();
extern void _ZN3ccc9FF1x15y13D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y13E[] = {
  NSPAIR(_ZN3ccc9FF1x15y13C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9FF1x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y13E[] = {
  {&(_ZTVN3ccc9FF1x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y13E[];
Class_Descriptor cd__ZN3ccc9FF1x15y13E = {  "_ZN3ccc9FF1x15y13E", // class name
  bases__ZN3ccc9FF1x15y13E, 2,
  &(vtc__ZN3ccc9FF1x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y13E),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
namespace ccc { 
struct  FF1x15y14  : virtual ::ccc::EE1x15 {
  virtual void  pqr(); // _ZN3ccc9FF1x15y143pqrEv
  ~FF1x15y14(); // tgen
  FF1x15y14(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y14E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1}
}
namespace ccc { 
void  ccc::FF1x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF1x15y143pqrEv");}
ccc::FF1x15y14 ::~FF1x15y14(){ note_dtor("_ZN3ccc9FF1x15y14E", this);} // tgen
ccc::FF1x15y14 ::FF1x15y14(){ note_ctor("_ZN3ccc9FF1x15y14E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y14E, buf);
    ::ccc::FF1x15y14 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y14E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y14E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y14E);
    dp->::ccc::FF1x15y14::~FF1x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y14E(Test__ZN3ccc9FF1x15y14E, "_ZN3ccc9FF1x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y14C1Ev();
extern void _ZN3ccc9FF1x15y14D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y14E[] = {
  NSPAIR(_ZN3ccc9FF1x15y14C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9FF1x15y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF1x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y14E[] = {
  {&(_ZTVN3ccc9FF1x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y14E[];
Class_Descriptor cd__ZN3ccc9FF1x15y14E = {  "_ZN3ccc9FF1x15y14E", // class name
  bases__ZN3ccc9FF1x15y14E, 2,
  &(vtc__ZN3ccc9FF1x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y14E),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
namespace ccc { 
struct  FF1x15y15  : virtual ::ccc::EE1x15 {
  ~FF1x15y15(); // tgen
  FF1x15y15(); // tgen
};
//SIG(1 _ZN3ccc9FF1x15y15E) C1{ VBC2{ VBC3{ v1 v2 v3}}}
}
namespace ccc { 
ccc::FF1x15y15 ::~FF1x15y15(){ note_dtor("_ZN3ccc9FF1x15y15E", this);} // tgen
ccc::FF1x15y15 ::FF1x15y15(){ note_ctor("_ZN3ccc9FF1x15y15E", this);} // tgen
}
static void Test__ZN3ccc9FF1x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF1x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF1x15y15E, buf);
    ::ccc::FF1x15y15 *dp, &lv = *(dp=new (buf) ::ccc::FF1x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF1x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF1x15y15E)");
    check_base_class_offset(lv, (::ccc::AA1*)(::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y15E");
    check_base_class_offset(lv, (::ccc::EE1x15*), 0, "_ZN3ccc9FF1x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF1x15y15E);
    dp->::ccc::FF1x15y15::~FF1x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF1x15y15E(Test__ZN3ccc9FF1x15y15E, "_ZN3ccc9FF1x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF1x15y15C1Ev();
extern void _ZN3ccc9FF1x15y15D1Ev();
Name_Map name_map__ZN3ccc9FF1x15y15E[] = {
  NSPAIR(_ZN3ccc9FF1x15y15C1Ev),
  NSPAIR(_ZN3ccc9FF1x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc6EE1x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE1x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE1x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE1x15E[];
static Base_Class bases__ZN3ccc9FF1x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE1x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF1x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF1x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF1x15y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE1x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF1x15y15E[] = {
  {&(_ZTVN3ccc9FF1x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF1x15y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE1x15E__NS_9FF1x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF1x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF1x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF1x15y15E[];
Class_Descriptor cd__ZN3ccc9FF1x15y15E = {  "_ZN3ccc9FF1x15y15E", // class name
  bases__ZN3ccc9FF1x15y15E, 2,
  &(vtc__ZN3ccc9FF1x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF1x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF1x15y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF1x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF1x15y15E),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
namespace ccc { 
struct  FF2x0y0  : virtual ::ccc::EE2x0 {
  virtual void  abc(); // _ZN3ccc7FF2x0y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y03pqrEv
  ~FF2x0y0(); // tgen
  FF2x0y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y03abcEv");}
void  ccc::FF2x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y03efgEv");}
void  ccc::FF2x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y03pqrEv");}
ccc::FF2x0y0 ::~FF2x0y0(){ note_dtor("_ZN3ccc7FF2x0y0E", this);} // tgen
ccc::FF2x0y0 ::FF2x0y0(){ note_ctor("_ZN3ccc7FF2x0y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y0E, buf);
    ::ccc::FF2x0y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y0E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y0E);
    dp->::ccc::FF2x0y0::~FF2x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y0E(Test__ZN3ccc7FF2x0y0E, "_ZN3ccc7FF2x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y0C1Ev();
extern void _ZN3ccc7FF2x0y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y0E[] = {
  NSPAIR(_ZN3ccc7FF2x0y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y0E[];
extern void _ZN3ccc7FF2x0y03efgEv();
extern void _ZN3ccc7FF2x0y03abcEv();
extern void _ZN3ccc7FF2x0y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y0E[] = {
  {&(_ZTVN3ccc7FF2x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y0E[];
static VTBL_ENTRY alt_thunk_names481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y0E = {  "_ZN3ccc7FF2x0y0E", // class name
  bases__ZN3ccc7FF2x0y0E, 2,
  &(vtc__ZN3ccc7FF2x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names481,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y1  : virtual ::ccc::EE2x0 {
  virtual void  abc(); // _ZN3ccc7FF2x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x0y13efgEv
  ~FF2x0y1(); // tgen
  FF2x0y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y13abcEv");}
void  ccc::FF2x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y13pqrEv");}
void  ccc::FF2x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y13efgEv");}
ccc::FF2x0y1 ::~FF2x0y1(){ note_dtor("_ZN3ccc7FF2x0y1E", this);} // tgen
ccc::FF2x0y1 ::FF2x0y1(){ note_ctor("_ZN3ccc7FF2x0y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y1E, buf);
    ::ccc::FF2x0y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y1E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y1E);
    dp->::ccc::FF2x0y1::~FF2x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y1E(Test__ZN3ccc7FF2x0y1E, "_ZN3ccc7FF2x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y1C1Ev();
extern void _ZN3ccc7FF2x0y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y1E[] = {
  NSPAIR(_ZN3ccc7FF2x0y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y1E[];
extern void _ZN3ccc7FF2x0y13efgEv();
extern void _ZN3ccc7FF2x0y13abcEv();
extern void _ZN3ccc7FF2x0y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y1E[] = {
  {&(_ZTVN3ccc7FF2x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y1E[];
static VTBL_ENTRY alt_thunk_names482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y1E = {  "_ZN3ccc7FF2x0y1E", // class name
  bases__ZN3ccc7FF2x0y1E, 2,
  &(vtc__ZN3ccc7FF2x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names482,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y2  : virtual ::ccc::EE2x0 {
  virtual void  efg(); // _ZN3ccc7FF2x0y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y23pqrEv
  ~FF2x0y2(); // tgen
  FF2x0y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y23efgEv");}
void  ccc::FF2x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y23abcEv");}
void  ccc::FF2x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y23pqrEv");}
ccc::FF2x0y2 ::~FF2x0y2(){ note_dtor("_ZN3ccc7FF2x0y2E", this);} // tgen
ccc::FF2x0y2 ::FF2x0y2(){ note_ctor("_ZN3ccc7FF2x0y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y2E, buf);
    ::ccc::FF2x0y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y2E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y2E);
    dp->::ccc::FF2x0y2::~FF2x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y2E(Test__ZN3ccc7FF2x0y2E, "_ZN3ccc7FF2x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y2C1Ev();
extern void _ZN3ccc7FF2x0y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y2E[] = {
  NSPAIR(_ZN3ccc7FF2x0y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y2E[];
extern void _ZN3ccc7FF2x0y23efgEv();
extern void _ZN3ccc7FF2x0y23abcEv();
extern void _ZN3ccc7FF2x0y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y2E[] = {
  {&(_ZTVN3ccc7FF2x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y2E[];
static VTBL_ENTRY alt_thunk_names483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y2E = {  "_ZN3ccc7FF2x0y2E", // class name
  bases__ZN3ccc7FF2x0y2E, 2,
  &(vtc__ZN3ccc7FF2x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names483,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y3  : virtual ::ccc::EE2x0 {
  virtual void  efg(); // _ZN3ccc7FF2x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x0y33abcEv
  ~FF2x0y3(); // tgen
  FF2x0y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y33efgEv");}
void  ccc::FF2x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y33pqrEv");}
void  ccc::FF2x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y33abcEv");}
ccc::FF2x0y3 ::~FF2x0y3(){ note_dtor("_ZN3ccc7FF2x0y3E", this);} // tgen
ccc::FF2x0y3 ::FF2x0y3(){ note_ctor("_ZN3ccc7FF2x0y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y3E, buf);
    ::ccc::FF2x0y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y3E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y3E);
    dp->::ccc::FF2x0y3::~FF2x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y3E(Test__ZN3ccc7FF2x0y3E, "_ZN3ccc7FF2x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y3C1Ev();
extern void _ZN3ccc7FF2x0y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y3E[] = {
  NSPAIR(_ZN3ccc7FF2x0y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y3E[];
extern void _ZN3ccc7FF2x0y33efgEv();
extern void _ZN3ccc7FF2x0y33abcEv();
extern void _ZN3ccc7FF2x0y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y3E[] = {
  {&(_ZTVN3ccc7FF2x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y3E[];
static VTBL_ENTRY alt_thunk_names484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y3E = {  "_ZN3ccc7FF2x0y3E", // class name
  bases__ZN3ccc7FF2x0y3E, 2,
  &(vtc__ZN3ccc7FF2x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names484,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y4  : virtual ::ccc::EE2x0 {
  virtual void  pqr(); // _ZN3ccc7FF2x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x0y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x0y43efgEv
  ~FF2x0y4(); // tgen
  FF2x0y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y43pqrEv");}
void  ccc::FF2x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y43abcEv");}
void  ccc::FF2x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y43efgEv");}
ccc::FF2x0y4 ::~FF2x0y4(){ note_dtor("_ZN3ccc7FF2x0y4E", this);} // tgen
ccc::FF2x0y4 ::FF2x0y4(){ note_ctor("_ZN3ccc7FF2x0y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y4E, buf);
    ::ccc::FF2x0y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y4E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y4E);
    dp->::ccc::FF2x0y4::~FF2x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y4E(Test__ZN3ccc7FF2x0y4E, "_ZN3ccc7FF2x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y4C1Ev();
extern void _ZN3ccc7FF2x0y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y4E[] = {
  NSPAIR(_ZN3ccc7FF2x0y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y4E[];
extern void _ZN3ccc7FF2x0y43efgEv();
extern void _ZN3ccc7FF2x0y43abcEv();
extern void _ZN3ccc7FF2x0y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y4E[] = {
  {&(_ZTVN3ccc7FF2x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y4E[];
static VTBL_ENTRY alt_thunk_names485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y4E = {  "_ZN3ccc7FF2x0y4E", // class name
  bases__ZN3ccc7FF2x0y4E, 2,
  &(vtc__ZN3ccc7FF2x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names485,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y5  : virtual ::ccc::EE2x0 {
  virtual void  pqr(); // _ZN3ccc7FF2x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x0y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x0y53abcEv
  ~FF2x0y5(); // tgen
  FF2x0y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y53pqrEv");}
void  ccc::FF2x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y53efgEv");}
void  ccc::FF2x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y53abcEv");}
ccc::FF2x0y5 ::~FF2x0y5(){ note_dtor("_ZN3ccc7FF2x0y5E", this);} // tgen
ccc::FF2x0y5 ::FF2x0y5(){ note_ctor("_ZN3ccc7FF2x0y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y5E, buf);
    ::ccc::FF2x0y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y5E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y5E);
    dp->::ccc::FF2x0y5::~FF2x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y5E(Test__ZN3ccc7FF2x0y5E, "_ZN3ccc7FF2x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y5C1Ev();
extern void _ZN3ccc7FF2x0y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y5E[] = {
  NSPAIR(_ZN3ccc7FF2x0y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y5E[];
extern void _ZN3ccc7FF2x0y53efgEv();
extern void _ZN3ccc7FF2x0y53abcEv();
extern void _ZN3ccc7FF2x0y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y5E[] = {
  {&(_ZTVN3ccc7FF2x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y5E[];
static VTBL_ENTRY alt_thunk_names486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y5E = {  "_ZN3ccc7FF2x0y5E", // class name
  bases__ZN3ccc7FF2x0y5E, 2,
  &(vtc__ZN3ccc7FF2x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names486,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y6  : virtual ::ccc::EE2x0 {
  virtual void  abc(); // _ZN3ccc7FF2x0y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x0y63efgEv
  ~FF2x0y6(); // tgen
  FF2x0y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y63abcEv");}
void  ccc::FF2x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y63efgEv");}
ccc::FF2x0y6 ::~FF2x0y6(){ note_dtor("_ZN3ccc7FF2x0y6E", this);} // tgen
ccc::FF2x0y6 ::FF2x0y6(){ note_ctor("_ZN3ccc7FF2x0y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y6E, buf);
    ::ccc::FF2x0y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y6E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y6E);
    dp->::ccc::FF2x0y6::~FF2x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y6E(Test__ZN3ccc7FF2x0y6E, "_ZN3ccc7FF2x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y6C1Ev();
extern void _ZN3ccc7FF2x0y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y6E[] = {
  NSPAIR(_ZN3ccc7FF2x0y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y6E[];
extern void _ZN3ccc7FF2x0y63efgEv();
extern void _ZN3ccc7FF2x0y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y6E[] = {
  {&(_ZTVN3ccc7FF2x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y6E[];
static VTBL_ENTRY alt_thunk_names487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y6E = {  "_ZN3ccc7FF2x0y6E", // class name
  bases__ZN3ccc7FF2x0y6E, 2,
  &(vtc__ZN3ccc7FF2x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names487,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y7  : virtual ::ccc::EE2x0 {
  virtual void  abc(); // _ZN3ccc7FF2x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y73pqrEv
  ~FF2x0y7(); // tgen
  FF2x0y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y73abcEv");}
void  ccc::FF2x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y73pqrEv");}
ccc::FF2x0y7 ::~FF2x0y7(){ note_dtor("_ZN3ccc7FF2x0y7E", this);} // tgen
ccc::FF2x0y7 ::FF2x0y7(){ note_ctor("_ZN3ccc7FF2x0y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y7E, buf);
    ::ccc::FF2x0y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y7E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y7E);
    dp->::ccc::FF2x0y7::~FF2x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y7E(Test__ZN3ccc7FF2x0y7E, "_ZN3ccc7FF2x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y7C1Ev();
extern void _ZN3ccc7FF2x0y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y7E[] = {
  NSPAIR(_ZN3ccc7FF2x0y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x0y73abcEv();
extern void _ZN3ccc7FF2x0y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y7E[] = {
  {&(_ZTVN3ccc7FF2x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y7E[];
static VTBL_ENTRY alt_thunk_names488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y7E = {  "_ZN3ccc7FF2x0y7E", // class name
  bases__ZN3ccc7FF2x0y7E, 2,
  &(vtc__ZN3ccc7FF2x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names488,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y8  : virtual ::ccc::EE2x0 {
  virtual void  efg(); // _ZN3ccc7FF2x0y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x0y83abcEv
  ~FF2x0y8(); // tgen
  FF2x0y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y83efgEv");}
void  ccc::FF2x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x0y83abcEv");}
ccc::FF2x0y8 ::~FF2x0y8(){ note_dtor("_ZN3ccc7FF2x0y8E", this);} // tgen
ccc::FF2x0y8 ::FF2x0y8(){ note_ctor("_ZN3ccc7FF2x0y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y8E, buf);
    ::ccc::FF2x0y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y8E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y8E);
    dp->::ccc::FF2x0y8::~FF2x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y8E(Test__ZN3ccc7FF2x0y8E, "_ZN3ccc7FF2x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y8C1Ev();
extern void _ZN3ccc7FF2x0y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y8E[] = {
  NSPAIR(_ZN3ccc7FF2x0y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y8E[];
extern void _ZN3ccc7FF2x0y83efgEv();
extern void _ZN3ccc7FF2x0y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y8E[] = {
  {&(_ZTVN3ccc7FF2x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y8E[];
static VTBL_ENTRY alt_thunk_names489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y8E = {  "_ZN3ccc7FF2x0y8E", // class name
  bases__ZN3ccc7FF2x0y8E, 2,
  &(vtc__ZN3ccc7FF2x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names489,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y9  : virtual ::ccc::EE2x0 {
  virtual void  efg(); // _ZN3ccc7FF2x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x0y93pqrEv
  ~FF2x0y9(); // tgen
  FF2x0y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x0y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x0y93efgEv");}
void  ccc::FF2x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x0y93pqrEv");}
ccc::FF2x0y9 ::~FF2x0y9(){ note_dtor("_ZN3ccc7FF2x0y9E", this);} // tgen
ccc::FF2x0y9 ::FF2x0y9(){ note_ctor("_ZN3ccc7FF2x0y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x0y9E, buf);
    ::ccc::FF2x0y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x0y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y9E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc7FF2x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x0y9E);
    dp->::ccc::FF2x0y9::~FF2x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x0y9E(Test__ZN3ccc7FF2x0y9E, "_ZN3ccc7FF2x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x0y9C1Ev();
extern void _ZN3ccc7FF2x0y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x0y9E[] = {
  NSPAIR(_ZN3ccc7FF2x0y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc7FF2x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y9E[];
extern void _ZN3ccc7FF2x0y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x0y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x0y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x0y9E[] = {
  {&(_ZTVN3ccc7FF2x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x0y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_7FF2x0y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x0y9E[];
static VTBL_ENTRY alt_thunk_names490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x0y9E = {  "_ZN3ccc7FF2x0y9E", // class name
  bases__ZN3ccc7FF2x0y9E, 2,
  &(vtc__ZN3ccc7FF2x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x0y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x0y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x0y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x0y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names490,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y10  : virtual ::ccc::EE2x0 {
  virtual void  pqr(); // _ZN3ccc8FF2x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x0y103abcEv
  ~FF2x0y10(); // tgen
  FF2x0y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x0y103pqrEv");}
void  ccc::FF2x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x0y103abcEv");}
ccc::FF2x0y10 ::~FF2x0y10(){ note_dtor("_ZN3ccc8FF2x0y10E", this);} // tgen
ccc::FF2x0y10 ::FF2x0y10(){ note_ctor("_ZN3ccc8FF2x0y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y10E, buf);
    ::ccc::FF2x0y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y10E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y10E);
    dp->::ccc::FF2x0y10::~FF2x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y10E(Test__ZN3ccc8FF2x0y10E, "_ZN3ccc8FF2x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y10C1Ev();
extern void _ZN3ccc8FF2x0y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y10E[] = {
  NSPAIR(_ZN3ccc8FF2x0y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x0y103abcEv();
extern void _ZN3ccc8FF2x0y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y10E[] = {
  {&(_ZTVN3ccc8FF2x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y10E[];
static VTBL_ENTRY alt_thunk_names491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y10E = {  "_ZN3ccc8FF2x0y10E", // class name
  bases__ZN3ccc8FF2x0y10E, 2,
  &(vtc__ZN3ccc8FF2x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names491,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y11  : virtual ::ccc::EE2x0 {
  virtual void  pqr(); // _ZN3ccc8FF2x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x0y113efgEv
  ~FF2x0y11(); // tgen
  FF2x0y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x0y113pqrEv");}
void  ccc::FF2x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x0y113efgEv");}
ccc::FF2x0y11 ::~FF2x0y11(){ note_dtor("_ZN3ccc8FF2x0y11E", this);} // tgen
ccc::FF2x0y11 ::FF2x0y11(){ note_ctor("_ZN3ccc8FF2x0y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y11E, buf);
    ::ccc::FF2x0y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y11E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y11E);
    dp->::ccc::FF2x0y11::~FF2x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y11E(Test__ZN3ccc8FF2x0y11E, "_ZN3ccc8FF2x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y11C1Ev();
extern void _ZN3ccc8FF2x0y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y11E[] = {
  NSPAIR(_ZN3ccc8FF2x0y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y11E[];
extern void _ZN3ccc8FF2x0y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x0y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y11E[] = {
  {&(_ZTVN3ccc8FF2x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y11E[];
static VTBL_ENTRY alt_thunk_names492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y11E = {  "_ZN3ccc8FF2x0y11E", // class name
  bases__ZN3ccc8FF2x0y11E, 2,
  &(vtc__ZN3ccc8FF2x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names492,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y12  : virtual ::ccc::EE2x0 {
  virtual void  abc(); // _ZN3ccc8FF2x0y123abcEv
  ~FF2x0y12(); // tgen
  FF2x0y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x0y123abcEv");}
ccc::FF2x0y12 ::~FF2x0y12(){ note_dtor("_ZN3ccc8FF2x0y12E", this);} // tgen
ccc::FF2x0y12 ::FF2x0y12(){ note_ctor("_ZN3ccc8FF2x0y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y12E, buf);
    ::ccc::FF2x0y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y12E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y12E);
    dp->::ccc::FF2x0y12::~FF2x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y12E(Test__ZN3ccc8FF2x0y12E, "_ZN3ccc8FF2x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y12C1Ev();
extern void _ZN3ccc8FF2x0y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y12E[] = {
  NSPAIR(_ZN3ccc8FF2x0y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x0y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y12E[] = {
  {&(_ZTVN3ccc8FF2x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y12E[];
static VTBL_ENTRY alt_thunk_names493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y12E = {  "_ZN3ccc8FF2x0y12E", // class name
  bases__ZN3ccc8FF2x0y12E, 2,
  &(vtc__ZN3ccc8FF2x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names493,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y13  : virtual ::ccc::EE2x0 {
  virtual void  efg(); // _ZN3ccc8FF2x0y133efgEv
  ~FF2x0y13(); // tgen
  FF2x0y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x0y133efgEv");}
ccc::FF2x0y13 ::~FF2x0y13(){ note_dtor("_ZN3ccc8FF2x0y13E", this);} // tgen
ccc::FF2x0y13 ::FF2x0y13(){ note_ctor("_ZN3ccc8FF2x0y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y13E, buf);
    ::ccc::FF2x0y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y13E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y13E);
    dp->::ccc::FF2x0y13::~FF2x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y13E(Test__ZN3ccc8FF2x0y13E, "_ZN3ccc8FF2x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y13C1Ev();
extern void _ZN3ccc8FF2x0y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y13E[] = {
  NSPAIR(_ZN3ccc8FF2x0y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y13E[];
extern void _ZN3ccc8FF2x0y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y13E[] = {
  {&(_ZTVN3ccc8FF2x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y13E[];
static VTBL_ENTRY alt_thunk_names494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y13E = {  "_ZN3ccc8FF2x0y13E", // class name
  bases__ZN3ccc8FF2x0y13E, 2,
  &(vtc__ZN3ccc8FF2x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names494,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y14  : virtual ::ccc::EE2x0 {
  virtual void  pqr(); // _ZN3ccc8FF2x0y143pqrEv
  ~FF2x0y14(); // tgen
  FF2x0y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x0y143pqrEv");}
ccc::FF2x0y14 ::~FF2x0y14(){ note_dtor("_ZN3ccc8FF2x0y14E", this);} // tgen
ccc::FF2x0y14 ::FF2x0y14(){ note_ctor("_ZN3ccc8FF2x0y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y14E, buf);
    ::ccc::FF2x0y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y14E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y14E);
    dp->::ccc::FF2x0y14::~FF2x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y14E(Test__ZN3ccc8FF2x0y14E, "_ZN3ccc8FF2x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y14C1Ev();
extern void _ZN3ccc8FF2x0y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y14E[] = {
  NSPAIR(_ZN3ccc8FF2x0y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x0y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x0y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y14E[] = {
  {&(_ZTVN3ccc8FF2x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y14E[];
static VTBL_ENTRY alt_thunk_names495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y14E = {  "_ZN3ccc8FF2x0y14E", // class name
  bases__ZN3ccc8FF2x0y14E, 2,
  &(vtc__ZN3ccc8FF2x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names495,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x0y15  : virtual ::ccc::EE2x0 {
  ~FF2x0y15(); // tgen
  FF2x0y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x0y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x0y15 ::~FF2x0y15(){ note_dtor("_ZN3ccc8FF2x0y15E", this);} // tgen
ccc::FF2x0y15 ::FF2x0y15(){ note_ctor("_ZN3ccc8FF2x0y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x0y15E, buf);
    ::ccc::FF2x0y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x0y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y15E");
    check_base_class_offset(lv, (::ccc::EE2x0*), 0, "_ZN3ccc8FF2x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x0y15E);
    dp->::ccc::FF2x0y15::~FF2x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x0y15E(Test__ZN3ccc8FF2x0y15E, "_ZN3ccc8FF2x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x0y15C1Ev();
extern void _ZN3ccc8FF2x0y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x0y15E[] = {
  NSPAIR(_ZN3ccc8FF2x0y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x0E[];
static Base_Class bases__ZN3ccc8FF2x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x0y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv)();
extern void _ZN3ccc5EE2x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv)();
extern void _ZN3ccc5EE2x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv)();
extern void _ZN3ccc5EE2x03pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x0y15E[] = {
  {&(_ZTVN3ccc8FF2x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x0y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x0E__NS_8FF2x0y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x0y15E[];
static VTBL_ENTRY alt_thunk_names496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x03pqrEv,_ZTv0_n20_N3ccc5EE2x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x03abcEv,_ZTv0_n16_N3ccc5EE2x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x03efgEv,_ZTv0_n12_N3ccc5EE2x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x0y15E = {  "_ZN3ccc8FF2x0y15E", // class name
  bases__ZN3ccc8FF2x0y15E, 2,
  &(vtc__ZN3ccc8FF2x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x0y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x0y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x0y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x0y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names496,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y0  : virtual ::ccc::EE2x1 {
  virtual void  abc(); // _ZN3ccc7FF2x1y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y03pqrEv
  ~FF2x1y0(); // tgen
  FF2x1y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y03abcEv");}
void  ccc::FF2x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y03efgEv");}
void  ccc::FF2x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y03pqrEv");}
ccc::FF2x1y0 ::~FF2x1y0(){ note_dtor("_ZN3ccc7FF2x1y0E", this);} // tgen
ccc::FF2x1y0 ::FF2x1y0(){ note_ctor("_ZN3ccc7FF2x1y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y0E, buf);
    ::ccc::FF2x1y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y0E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y0E);
    dp->::ccc::FF2x1y0::~FF2x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y0E(Test__ZN3ccc7FF2x1y0E, "_ZN3ccc7FF2x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y0C1Ev();
extern void _ZN3ccc7FF2x1y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y0E[] = {
  NSPAIR(_ZN3ccc7FF2x1y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y0E[];
extern void _ZN3ccc7FF2x1y03efgEv();
extern void _ZN3ccc7FF2x1y03abcEv();
extern void _ZN3ccc7FF2x1y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y0E[] = {
  {&(_ZTVN3ccc7FF2x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y0E[];
static VTBL_ENTRY alt_thunk_names497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y0E = {  "_ZN3ccc7FF2x1y0E", // class name
  bases__ZN3ccc7FF2x1y0E, 2,
  &(vtc__ZN3ccc7FF2x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names497,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y1  : virtual ::ccc::EE2x1 {
  virtual void  abc(); // _ZN3ccc7FF2x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x1y13efgEv
  ~FF2x1y1(); // tgen
  FF2x1y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y13abcEv");}
void  ccc::FF2x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y13pqrEv");}
void  ccc::FF2x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y13efgEv");}
ccc::FF2x1y1 ::~FF2x1y1(){ note_dtor("_ZN3ccc7FF2x1y1E", this);} // tgen
ccc::FF2x1y1 ::FF2x1y1(){ note_ctor("_ZN3ccc7FF2x1y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y1E, buf);
    ::ccc::FF2x1y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y1E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y1E);
    dp->::ccc::FF2x1y1::~FF2x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y1E(Test__ZN3ccc7FF2x1y1E, "_ZN3ccc7FF2x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y1C1Ev();
extern void _ZN3ccc7FF2x1y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y1E[] = {
  NSPAIR(_ZN3ccc7FF2x1y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y1E[];
extern void _ZN3ccc7FF2x1y13efgEv();
extern void _ZN3ccc7FF2x1y13abcEv();
extern void _ZN3ccc7FF2x1y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y1E[] = {
  {&(_ZTVN3ccc7FF2x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y1E[];
static VTBL_ENTRY alt_thunk_names498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y1E = {  "_ZN3ccc7FF2x1y1E", // class name
  bases__ZN3ccc7FF2x1y1E, 2,
  &(vtc__ZN3ccc7FF2x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names498,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y2  : virtual ::ccc::EE2x1 {
  virtual void  efg(); // _ZN3ccc7FF2x1y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y23pqrEv
  ~FF2x1y2(); // tgen
  FF2x1y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y23efgEv");}
void  ccc::FF2x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y23abcEv");}
void  ccc::FF2x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y23pqrEv");}
ccc::FF2x1y2 ::~FF2x1y2(){ note_dtor("_ZN3ccc7FF2x1y2E", this);} // tgen
ccc::FF2x1y2 ::FF2x1y2(){ note_ctor("_ZN3ccc7FF2x1y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y2E, buf);
    ::ccc::FF2x1y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y2E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y2E);
    dp->::ccc::FF2x1y2::~FF2x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y2E(Test__ZN3ccc7FF2x1y2E, "_ZN3ccc7FF2x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y2C1Ev();
extern void _ZN3ccc7FF2x1y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y2E[] = {
  NSPAIR(_ZN3ccc7FF2x1y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y2E[];
extern void _ZN3ccc7FF2x1y23efgEv();
extern void _ZN3ccc7FF2x1y23abcEv();
extern void _ZN3ccc7FF2x1y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y2E[] = {
  {&(_ZTVN3ccc7FF2x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y2E[];
static VTBL_ENTRY alt_thunk_names499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y2E = {  "_ZN3ccc7FF2x1y2E", // class name
  bases__ZN3ccc7FF2x1y2E, 2,
  &(vtc__ZN3ccc7FF2x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names499,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y3  : virtual ::ccc::EE2x1 {
  virtual void  efg(); // _ZN3ccc7FF2x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x1y33abcEv
  ~FF2x1y3(); // tgen
  FF2x1y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y33efgEv");}
void  ccc::FF2x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y33pqrEv");}
void  ccc::FF2x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y33abcEv");}
ccc::FF2x1y3 ::~FF2x1y3(){ note_dtor("_ZN3ccc7FF2x1y3E", this);} // tgen
ccc::FF2x1y3 ::FF2x1y3(){ note_ctor("_ZN3ccc7FF2x1y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y3E, buf);
    ::ccc::FF2x1y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y3E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y3E);
    dp->::ccc::FF2x1y3::~FF2x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y3E(Test__ZN3ccc7FF2x1y3E, "_ZN3ccc7FF2x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y3C1Ev();
extern void _ZN3ccc7FF2x1y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y3E[] = {
  NSPAIR(_ZN3ccc7FF2x1y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y3E[];
extern void _ZN3ccc7FF2x1y33efgEv();
extern void _ZN3ccc7FF2x1y33abcEv();
extern void _ZN3ccc7FF2x1y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y3E[] = {
  {&(_ZTVN3ccc7FF2x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y3E[];
static VTBL_ENTRY alt_thunk_names500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y3E = {  "_ZN3ccc7FF2x1y3E", // class name
  bases__ZN3ccc7FF2x1y3E, 2,
  &(vtc__ZN3ccc7FF2x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names500,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y4  : virtual ::ccc::EE2x1 {
  virtual void  pqr(); // _ZN3ccc7FF2x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x1y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x1y43efgEv
  ~FF2x1y4(); // tgen
  FF2x1y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y43pqrEv");}
void  ccc::FF2x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y43abcEv");}
void  ccc::FF2x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y43efgEv");}
ccc::FF2x1y4 ::~FF2x1y4(){ note_dtor("_ZN3ccc7FF2x1y4E", this);} // tgen
ccc::FF2x1y4 ::FF2x1y4(){ note_ctor("_ZN3ccc7FF2x1y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y4E, buf);
    ::ccc::FF2x1y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y4E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y4E);
    dp->::ccc::FF2x1y4::~FF2x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y4E(Test__ZN3ccc7FF2x1y4E, "_ZN3ccc7FF2x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y4C1Ev();
extern void _ZN3ccc7FF2x1y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y4E[] = {
  NSPAIR(_ZN3ccc7FF2x1y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y4E[];
extern void _ZN3ccc7FF2x1y43efgEv();
extern void _ZN3ccc7FF2x1y43abcEv();
extern void _ZN3ccc7FF2x1y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y4E[] = {
  {&(_ZTVN3ccc7FF2x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y4E[];
static VTBL_ENTRY alt_thunk_names501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y4E = {  "_ZN3ccc7FF2x1y4E", // class name
  bases__ZN3ccc7FF2x1y4E, 2,
  &(vtc__ZN3ccc7FF2x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names501,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y5  : virtual ::ccc::EE2x1 {
  virtual void  pqr(); // _ZN3ccc7FF2x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x1y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x1y53abcEv
  ~FF2x1y5(); // tgen
  FF2x1y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y53pqrEv");}
void  ccc::FF2x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y53efgEv");}
void  ccc::FF2x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y53abcEv");}
ccc::FF2x1y5 ::~FF2x1y5(){ note_dtor("_ZN3ccc7FF2x1y5E", this);} // tgen
ccc::FF2x1y5 ::FF2x1y5(){ note_ctor("_ZN3ccc7FF2x1y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y5E, buf);
    ::ccc::FF2x1y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y5E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y5E);
    dp->::ccc::FF2x1y5::~FF2x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y5E(Test__ZN3ccc7FF2x1y5E, "_ZN3ccc7FF2x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y5C1Ev();
extern void _ZN3ccc7FF2x1y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y5E[] = {
  NSPAIR(_ZN3ccc7FF2x1y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y5E[];
extern void _ZN3ccc7FF2x1y53efgEv();
extern void _ZN3ccc7FF2x1y53abcEv();
extern void _ZN3ccc7FF2x1y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y5E[] = {
  {&(_ZTVN3ccc7FF2x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y5E[];
static VTBL_ENTRY alt_thunk_names502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y5E = {  "_ZN3ccc7FF2x1y5E", // class name
  bases__ZN3ccc7FF2x1y5E, 2,
  &(vtc__ZN3ccc7FF2x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names502,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y6  : virtual ::ccc::EE2x1 {
  virtual void  abc(); // _ZN3ccc7FF2x1y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x1y63efgEv
  ~FF2x1y6(); // tgen
  FF2x1y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y63abcEv");}
void  ccc::FF2x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y63efgEv");}
ccc::FF2x1y6 ::~FF2x1y6(){ note_dtor("_ZN3ccc7FF2x1y6E", this);} // tgen
ccc::FF2x1y6 ::FF2x1y6(){ note_ctor("_ZN3ccc7FF2x1y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y6E, buf);
    ::ccc::FF2x1y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y6E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y6E);
    dp->::ccc::FF2x1y6::~FF2x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y6E(Test__ZN3ccc7FF2x1y6E, "_ZN3ccc7FF2x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y6C1Ev();
extern void _ZN3ccc7FF2x1y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y6E[] = {
  NSPAIR(_ZN3ccc7FF2x1y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y6E[];
extern void _ZN3ccc7FF2x1y63efgEv();
extern void _ZN3ccc7FF2x1y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y6E[] = {
  {&(_ZTVN3ccc7FF2x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y6E[];
static VTBL_ENTRY alt_thunk_names503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y6E = {  "_ZN3ccc7FF2x1y6E", // class name
  bases__ZN3ccc7FF2x1y6E, 2,
  &(vtc__ZN3ccc7FF2x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names503,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y7  : virtual ::ccc::EE2x1 {
  virtual void  abc(); // _ZN3ccc7FF2x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y73pqrEv
  ~FF2x1y7(); // tgen
  FF2x1y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y73abcEv");}
void  ccc::FF2x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y73pqrEv");}
ccc::FF2x1y7 ::~FF2x1y7(){ note_dtor("_ZN3ccc7FF2x1y7E", this);} // tgen
ccc::FF2x1y7 ::FF2x1y7(){ note_ctor("_ZN3ccc7FF2x1y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y7E, buf);
    ::ccc::FF2x1y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y7E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y7E);
    dp->::ccc::FF2x1y7::~FF2x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y7E(Test__ZN3ccc7FF2x1y7E, "_ZN3ccc7FF2x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y7C1Ev();
extern void _ZN3ccc7FF2x1y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y7E[] = {
  NSPAIR(_ZN3ccc7FF2x1y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x1y73abcEv();
extern void _ZN3ccc7FF2x1y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y7E[] = {
  {&(_ZTVN3ccc7FF2x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y7E[];
static VTBL_ENTRY alt_thunk_names504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y7E = {  "_ZN3ccc7FF2x1y7E", // class name
  bases__ZN3ccc7FF2x1y7E, 2,
  &(vtc__ZN3ccc7FF2x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names504,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y8  : virtual ::ccc::EE2x1 {
  virtual void  efg(); // _ZN3ccc7FF2x1y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x1y83abcEv
  ~FF2x1y8(); // tgen
  FF2x1y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y83efgEv");}
void  ccc::FF2x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x1y83abcEv");}
ccc::FF2x1y8 ::~FF2x1y8(){ note_dtor("_ZN3ccc7FF2x1y8E", this);} // tgen
ccc::FF2x1y8 ::FF2x1y8(){ note_ctor("_ZN3ccc7FF2x1y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y8E, buf);
    ::ccc::FF2x1y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y8E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y8E);
    dp->::ccc::FF2x1y8::~FF2x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y8E(Test__ZN3ccc7FF2x1y8E, "_ZN3ccc7FF2x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y8C1Ev();
extern void _ZN3ccc7FF2x1y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y8E[] = {
  NSPAIR(_ZN3ccc7FF2x1y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y8E[];
extern void _ZN3ccc7FF2x1y83efgEv();
extern void _ZN3ccc7FF2x1y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y8E[] = {
  {&(_ZTVN3ccc7FF2x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y8E[];
static VTBL_ENTRY alt_thunk_names505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y8E = {  "_ZN3ccc7FF2x1y8E", // class name
  bases__ZN3ccc7FF2x1y8E, 2,
  &(vtc__ZN3ccc7FF2x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names505,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y9  : virtual ::ccc::EE2x1 {
  virtual void  efg(); // _ZN3ccc7FF2x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x1y93pqrEv
  ~FF2x1y9(); // tgen
  FF2x1y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x1y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x1y93efgEv");}
void  ccc::FF2x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x1y93pqrEv");}
ccc::FF2x1y9 ::~FF2x1y9(){ note_dtor("_ZN3ccc7FF2x1y9E", this);} // tgen
ccc::FF2x1y9 ::FF2x1y9(){ note_ctor("_ZN3ccc7FF2x1y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x1y9E, buf);
    ::ccc::FF2x1y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x1y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y9E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc7FF2x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x1y9E);
    dp->::ccc::FF2x1y9::~FF2x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x1y9E(Test__ZN3ccc7FF2x1y9E, "_ZN3ccc7FF2x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x1y9C1Ev();
extern void _ZN3ccc7FF2x1y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x1y9E[] = {
  NSPAIR(_ZN3ccc7FF2x1y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc7FF2x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y9E[];
extern void _ZN3ccc7FF2x1y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x1y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x1y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x1y9E[] = {
  {&(_ZTVN3ccc7FF2x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x1y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_7FF2x1y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x1y9E[];
static VTBL_ENTRY alt_thunk_names506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x1y9E = {  "_ZN3ccc7FF2x1y9E", // class name
  bases__ZN3ccc7FF2x1y9E, 2,
  &(vtc__ZN3ccc7FF2x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x1y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x1y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x1y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x1y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names506,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y10  : virtual ::ccc::EE2x1 {
  virtual void  pqr(); // _ZN3ccc8FF2x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x1y103abcEv
  ~FF2x1y10(); // tgen
  FF2x1y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x1y103pqrEv");}
void  ccc::FF2x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x1y103abcEv");}
ccc::FF2x1y10 ::~FF2x1y10(){ note_dtor("_ZN3ccc8FF2x1y10E", this);} // tgen
ccc::FF2x1y10 ::FF2x1y10(){ note_ctor("_ZN3ccc8FF2x1y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y10E, buf);
    ::ccc::FF2x1y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y10E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y10E);
    dp->::ccc::FF2x1y10::~FF2x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y10E(Test__ZN3ccc8FF2x1y10E, "_ZN3ccc8FF2x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y10C1Ev();
extern void _ZN3ccc8FF2x1y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y10E[] = {
  NSPAIR(_ZN3ccc8FF2x1y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x1y103abcEv();
extern void _ZN3ccc8FF2x1y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y10E[] = {
  {&(_ZTVN3ccc8FF2x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y10E[];
static VTBL_ENTRY alt_thunk_names507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y10E = {  "_ZN3ccc8FF2x1y10E", // class name
  bases__ZN3ccc8FF2x1y10E, 2,
  &(vtc__ZN3ccc8FF2x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names507,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y11  : virtual ::ccc::EE2x1 {
  virtual void  pqr(); // _ZN3ccc8FF2x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x1y113efgEv
  ~FF2x1y11(); // tgen
  FF2x1y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x1y113pqrEv");}
void  ccc::FF2x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x1y113efgEv");}
ccc::FF2x1y11 ::~FF2x1y11(){ note_dtor("_ZN3ccc8FF2x1y11E", this);} // tgen
ccc::FF2x1y11 ::FF2x1y11(){ note_ctor("_ZN3ccc8FF2x1y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y11E, buf);
    ::ccc::FF2x1y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y11E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y11E);
    dp->::ccc::FF2x1y11::~FF2x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y11E(Test__ZN3ccc8FF2x1y11E, "_ZN3ccc8FF2x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y11C1Ev();
extern void _ZN3ccc8FF2x1y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y11E[] = {
  NSPAIR(_ZN3ccc8FF2x1y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y11E[];
extern void _ZN3ccc8FF2x1y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x1y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y11E[] = {
  {&(_ZTVN3ccc8FF2x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y11E[];
static VTBL_ENTRY alt_thunk_names508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y11E = {  "_ZN3ccc8FF2x1y11E", // class name
  bases__ZN3ccc8FF2x1y11E, 2,
  &(vtc__ZN3ccc8FF2x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names508,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y12  : virtual ::ccc::EE2x1 {
  virtual void  abc(); // _ZN3ccc8FF2x1y123abcEv
  ~FF2x1y12(); // tgen
  FF2x1y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x1y123abcEv");}
ccc::FF2x1y12 ::~FF2x1y12(){ note_dtor("_ZN3ccc8FF2x1y12E", this);} // tgen
ccc::FF2x1y12 ::FF2x1y12(){ note_ctor("_ZN3ccc8FF2x1y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y12E, buf);
    ::ccc::FF2x1y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y12E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y12E);
    dp->::ccc::FF2x1y12::~FF2x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y12E(Test__ZN3ccc8FF2x1y12E, "_ZN3ccc8FF2x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y12C1Ev();
extern void _ZN3ccc8FF2x1y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y12E[] = {
  NSPAIR(_ZN3ccc8FF2x1y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x1y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y12E[] = {
  {&(_ZTVN3ccc8FF2x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y12E[];
static VTBL_ENTRY alt_thunk_names509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y12E = {  "_ZN3ccc8FF2x1y12E", // class name
  bases__ZN3ccc8FF2x1y12E, 2,
  &(vtc__ZN3ccc8FF2x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names509,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y13  : virtual ::ccc::EE2x1 {
  virtual void  efg(); // _ZN3ccc8FF2x1y133efgEv
  ~FF2x1y13(); // tgen
  FF2x1y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x1y133efgEv");}
ccc::FF2x1y13 ::~FF2x1y13(){ note_dtor("_ZN3ccc8FF2x1y13E", this);} // tgen
ccc::FF2x1y13 ::FF2x1y13(){ note_ctor("_ZN3ccc8FF2x1y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y13E, buf);
    ::ccc::FF2x1y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y13E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y13E);
    dp->::ccc::FF2x1y13::~FF2x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y13E(Test__ZN3ccc8FF2x1y13E, "_ZN3ccc8FF2x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y13C1Ev();
extern void _ZN3ccc8FF2x1y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y13E[] = {
  NSPAIR(_ZN3ccc8FF2x1y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y13E[];
extern void _ZN3ccc8FF2x1y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y13E[] = {
  {&(_ZTVN3ccc8FF2x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y13E[];
static VTBL_ENTRY alt_thunk_names510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y13E = {  "_ZN3ccc8FF2x1y13E", // class name
  bases__ZN3ccc8FF2x1y13E, 2,
  &(vtc__ZN3ccc8FF2x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names510,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y14  : virtual ::ccc::EE2x1 {
  virtual void  pqr(); // _ZN3ccc8FF2x1y143pqrEv
  ~FF2x1y14(); // tgen
  FF2x1y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x1y143pqrEv");}
ccc::FF2x1y14 ::~FF2x1y14(){ note_dtor("_ZN3ccc8FF2x1y14E", this);} // tgen
ccc::FF2x1y14 ::FF2x1y14(){ note_ctor("_ZN3ccc8FF2x1y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y14E, buf);
    ::ccc::FF2x1y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y14E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y14E);
    dp->::ccc::FF2x1y14::~FF2x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y14E(Test__ZN3ccc8FF2x1y14E, "_ZN3ccc8FF2x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y14C1Ev();
extern void _ZN3ccc8FF2x1y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y14E[] = {
  NSPAIR(_ZN3ccc8FF2x1y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x1y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x1y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y14E[] = {
  {&(_ZTVN3ccc8FF2x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y14E[];
static VTBL_ENTRY alt_thunk_names511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y14E = {  "_ZN3ccc8FF2x1y14E", // class name
  bases__ZN3ccc8FF2x1y14E, 2,
  &(vtc__ZN3ccc8FF2x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names511,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x1y15  : virtual ::ccc::EE2x1 {
  ~FF2x1y15(); // tgen
  FF2x1y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x1y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x1y15 ::~FF2x1y15(){ note_dtor("_ZN3ccc8FF2x1y15E", this);} // tgen
ccc::FF2x1y15 ::FF2x1y15(){ note_ctor("_ZN3ccc8FF2x1y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x1y15E, buf);
    ::ccc::FF2x1y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x1y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y15E");
    check_base_class_offset(lv, (::ccc::EE2x1*), 0, "_ZN3ccc8FF2x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x1y15E);
    dp->::ccc::FF2x1y15::~FF2x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x1y15E(Test__ZN3ccc8FF2x1y15E, "_ZN3ccc8FF2x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x1y15C1Ev();
extern void _ZN3ccc8FF2x1y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x1y15E[] = {
  NSPAIR(_ZN3ccc8FF2x1y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x1E[];
static Base_Class bases__ZN3ccc8FF2x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x1y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv)();
extern void _ZN3ccc5EE2x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv)();
extern void _ZN3ccc5EE2x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv)();
extern void _ZN3ccc5EE2x13pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x1y15E[] = {
  {&(_ZTVN3ccc8FF2x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x1y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x1E__NS_8FF2x1y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x1y15E[];
static VTBL_ENTRY alt_thunk_names512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x13pqrEv,_ZTv0_n20_N3ccc5EE2x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x13abcEv,_ZTv0_n16_N3ccc5EE2x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x13efgEv,_ZTv0_n12_N3ccc5EE2x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x1y15E = {  "_ZN3ccc8FF2x1y15E", // class name
  bases__ZN3ccc8FF2x1y15E, 2,
  &(vtc__ZN3ccc8FF2x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x1y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x1y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x1y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x1y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names512,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y0  : virtual ::ccc::EE2x2 {
  virtual void  abc(); // _ZN3ccc7FF2x2y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y03pqrEv
  ~FF2x2y0(); // tgen
  FF2x2y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y03abcEv");}
void  ccc::FF2x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y03efgEv");}
void  ccc::FF2x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y03pqrEv");}
ccc::FF2x2y0 ::~FF2x2y0(){ note_dtor("_ZN3ccc7FF2x2y0E", this);} // tgen
ccc::FF2x2y0 ::FF2x2y0(){ note_ctor("_ZN3ccc7FF2x2y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y0E, buf);
    ::ccc::FF2x2y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y0E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y0E);
    dp->::ccc::FF2x2y0::~FF2x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y0E(Test__ZN3ccc7FF2x2y0E, "_ZN3ccc7FF2x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y0C1Ev();
extern void _ZN3ccc7FF2x2y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y0E[] = {
  NSPAIR(_ZN3ccc7FF2x2y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y0E[];
extern void _ZN3ccc7FF2x2y03efgEv();
extern void _ZN3ccc7FF2x2y03abcEv();
extern void _ZN3ccc7FF2x2y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y0E[] = {
  {&(_ZTVN3ccc7FF2x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y0E[];
static VTBL_ENTRY alt_thunk_names513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y0E = {  "_ZN3ccc7FF2x2y0E", // class name
  bases__ZN3ccc7FF2x2y0E, 2,
  &(vtc__ZN3ccc7FF2x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names513,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y1  : virtual ::ccc::EE2x2 {
  virtual void  abc(); // _ZN3ccc7FF2x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x2y13efgEv
  ~FF2x2y1(); // tgen
  FF2x2y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y13abcEv");}
void  ccc::FF2x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y13pqrEv");}
void  ccc::FF2x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y13efgEv");}
ccc::FF2x2y1 ::~FF2x2y1(){ note_dtor("_ZN3ccc7FF2x2y1E", this);} // tgen
ccc::FF2x2y1 ::FF2x2y1(){ note_ctor("_ZN3ccc7FF2x2y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y1E, buf);
    ::ccc::FF2x2y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y1E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y1E);
    dp->::ccc::FF2x2y1::~FF2x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y1E(Test__ZN3ccc7FF2x2y1E, "_ZN3ccc7FF2x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y1C1Ev();
extern void _ZN3ccc7FF2x2y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y1E[] = {
  NSPAIR(_ZN3ccc7FF2x2y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y1E[];
extern void _ZN3ccc7FF2x2y13efgEv();
extern void _ZN3ccc7FF2x2y13abcEv();
extern void _ZN3ccc7FF2x2y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y1E[] = {
  {&(_ZTVN3ccc7FF2x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y1E[];
static VTBL_ENTRY alt_thunk_names514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y1E = {  "_ZN3ccc7FF2x2y1E", // class name
  bases__ZN3ccc7FF2x2y1E, 2,
  &(vtc__ZN3ccc7FF2x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names514,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y2  : virtual ::ccc::EE2x2 {
  virtual void  efg(); // _ZN3ccc7FF2x2y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y23pqrEv
  ~FF2x2y2(); // tgen
  FF2x2y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y23efgEv");}
void  ccc::FF2x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y23abcEv");}
void  ccc::FF2x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y23pqrEv");}
ccc::FF2x2y2 ::~FF2x2y2(){ note_dtor("_ZN3ccc7FF2x2y2E", this);} // tgen
ccc::FF2x2y2 ::FF2x2y2(){ note_ctor("_ZN3ccc7FF2x2y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y2E, buf);
    ::ccc::FF2x2y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y2E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y2E);
    dp->::ccc::FF2x2y2::~FF2x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y2E(Test__ZN3ccc7FF2x2y2E, "_ZN3ccc7FF2x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y2C1Ev();
extern void _ZN3ccc7FF2x2y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y2E[] = {
  NSPAIR(_ZN3ccc7FF2x2y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y2E[];
extern void _ZN3ccc7FF2x2y23efgEv();
extern void _ZN3ccc7FF2x2y23abcEv();
extern void _ZN3ccc7FF2x2y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y2E[] = {
  {&(_ZTVN3ccc7FF2x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y2E[];
static VTBL_ENTRY alt_thunk_names515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y2E = {  "_ZN3ccc7FF2x2y2E", // class name
  bases__ZN3ccc7FF2x2y2E, 2,
  &(vtc__ZN3ccc7FF2x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names515,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y3  : virtual ::ccc::EE2x2 {
  virtual void  efg(); // _ZN3ccc7FF2x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x2y33abcEv
  ~FF2x2y3(); // tgen
  FF2x2y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y33efgEv");}
void  ccc::FF2x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y33pqrEv");}
void  ccc::FF2x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y33abcEv");}
ccc::FF2x2y3 ::~FF2x2y3(){ note_dtor("_ZN3ccc7FF2x2y3E", this);} // tgen
ccc::FF2x2y3 ::FF2x2y3(){ note_ctor("_ZN3ccc7FF2x2y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y3E, buf);
    ::ccc::FF2x2y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y3E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y3E);
    dp->::ccc::FF2x2y3::~FF2x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y3E(Test__ZN3ccc7FF2x2y3E, "_ZN3ccc7FF2x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y3C1Ev();
extern void _ZN3ccc7FF2x2y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y3E[] = {
  NSPAIR(_ZN3ccc7FF2x2y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y3E[];
extern void _ZN3ccc7FF2x2y33efgEv();
extern void _ZN3ccc7FF2x2y33abcEv();
extern void _ZN3ccc7FF2x2y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y3E[] = {
  {&(_ZTVN3ccc7FF2x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y3E[];
static VTBL_ENTRY alt_thunk_names516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y3E = {  "_ZN3ccc7FF2x2y3E", // class name
  bases__ZN3ccc7FF2x2y3E, 2,
  &(vtc__ZN3ccc7FF2x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names516,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y4  : virtual ::ccc::EE2x2 {
  virtual void  pqr(); // _ZN3ccc7FF2x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x2y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x2y43efgEv
  ~FF2x2y4(); // tgen
  FF2x2y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y43pqrEv");}
void  ccc::FF2x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y43abcEv");}
void  ccc::FF2x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y43efgEv");}
ccc::FF2x2y4 ::~FF2x2y4(){ note_dtor("_ZN3ccc7FF2x2y4E", this);} // tgen
ccc::FF2x2y4 ::FF2x2y4(){ note_ctor("_ZN3ccc7FF2x2y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y4E, buf);
    ::ccc::FF2x2y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y4E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y4E);
    dp->::ccc::FF2x2y4::~FF2x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y4E(Test__ZN3ccc7FF2x2y4E, "_ZN3ccc7FF2x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y4C1Ev();
extern void _ZN3ccc7FF2x2y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y4E[] = {
  NSPAIR(_ZN3ccc7FF2x2y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y4E[];
extern void _ZN3ccc7FF2x2y43efgEv();
extern void _ZN3ccc7FF2x2y43abcEv();
extern void _ZN3ccc7FF2x2y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y4E[] = {
  {&(_ZTVN3ccc7FF2x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y4E[];
static VTBL_ENTRY alt_thunk_names517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y4E = {  "_ZN3ccc7FF2x2y4E", // class name
  bases__ZN3ccc7FF2x2y4E, 2,
  &(vtc__ZN3ccc7FF2x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names517,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y5  : virtual ::ccc::EE2x2 {
  virtual void  pqr(); // _ZN3ccc7FF2x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x2y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x2y53abcEv
  ~FF2x2y5(); // tgen
  FF2x2y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y53pqrEv");}
void  ccc::FF2x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y53efgEv");}
void  ccc::FF2x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y53abcEv");}
ccc::FF2x2y5 ::~FF2x2y5(){ note_dtor("_ZN3ccc7FF2x2y5E", this);} // tgen
ccc::FF2x2y5 ::FF2x2y5(){ note_ctor("_ZN3ccc7FF2x2y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y5E, buf);
    ::ccc::FF2x2y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y5E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y5E);
    dp->::ccc::FF2x2y5::~FF2x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y5E(Test__ZN3ccc7FF2x2y5E, "_ZN3ccc7FF2x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y5C1Ev();
extern void _ZN3ccc7FF2x2y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y5E[] = {
  NSPAIR(_ZN3ccc7FF2x2y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y5E[];
extern void _ZN3ccc7FF2x2y53efgEv();
extern void _ZN3ccc7FF2x2y53abcEv();
extern void _ZN3ccc7FF2x2y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y5E[] = {
  {&(_ZTVN3ccc7FF2x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y5E[];
static VTBL_ENTRY alt_thunk_names518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y5E = {  "_ZN3ccc7FF2x2y5E", // class name
  bases__ZN3ccc7FF2x2y5E, 2,
  &(vtc__ZN3ccc7FF2x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names518,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y6  : virtual ::ccc::EE2x2 {
  virtual void  abc(); // _ZN3ccc7FF2x2y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x2y63efgEv
  ~FF2x2y6(); // tgen
  FF2x2y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y63abcEv");}
void  ccc::FF2x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y63efgEv");}
ccc::FF2x2y6 ::~FF2x2y6(){ note_dtor("_ZN3ccc7FF2x2y6E", this);} // tgen
ccc::FF2x2y6 ::FF2x2y6(){ note_ctor("_ZN3ccc7FF2x2y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y6E, buf);
    ::ccc::FF2x2y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y6E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y6E);
    dp->::ccc::FF2x2y6::~FF2x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y6E(Test__ZN3ccc7FF2x2y6E, "_ZN3ccc7FF2x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y6C1Ev();
extern void _ZN3ccc7FF2x2y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y6E[] = {
  NSPAIR(_ZN3ccc7FF2x2y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y6E[];
extern void _ZN3ccc7FF2x2y63efgEv();
extern void _ZN3ccc7FF2x2y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y6E[] = {
  {&(_ZTVN3ccc7FF2x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y6E[];
static VTBL_ENTRY alt_thunk_names519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y6E = {  "_ZN3ccc7FF2x2y6E", // class name
  bases__ZN3ccc7FF2x2y6E, 2,
  &(vtc__ZN3ccc7FF2x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names519,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y7  : virtual ::ccc::EE2x2 {
  virtual void  abc(); // _ZN3ccc7FF2x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y73pqrEv
  ~FF2x2y7(); // tgen
  FF2x2y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y73abcEv");}
void  ccc::FF2x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y73pqrEv");}
ccc::FF2x2y7 ::~FF2x2y7(){ note_dtor("_ZN3ccc7FF2x2y7E", this);} // tgen
ccc::FF2x2y7 ::FF2x2y7(){ note_ctor("_ZN3ccc7FF2x2y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y7E, buf);
    ::ccc::FF2x2y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y7E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y7E);
    dp->::ccc::FF2x2y7::~FF2x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y7E(Test__ZN3ccc7FF2x2y7E, "_ZN3ccc7FF2x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y7C1Ev();
extern void _ZN3ccc7FF2x2y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y7E[] = {
  NSPAIR(_ZN3ccc7FF2x2y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x2y73abcEv();
extern void _ZN3ccc7FF2x2y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y7E[] = {
  {&(_ZTVN3ccc7FF2x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y7E[];
static VTBL_ENTRY alt_thunk_names520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y7E = {  "_ZN3ccc7FF2x2y7E", // class name
  bases__ZN3ccc7FF2x2y7E, 2,
  &(vtc__ZN3ccc7FF2x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names520,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y8  : virtual ::ccc::EE2x2 {
  virtual void  efg(); // _ZN3ccc7FF2x2y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x2y83abcEv
  ~FF2x2y8(); // tgen
  FF2x2y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y83efgEv");}
void  ccc::FF2x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x2y83abcEv");}
ccc::FF2x2y8 ::~FF2x2y8(){ note_dtor("_ZN3ccc7FF2x2y8E", this);} // tgen
ccc::FF2x2y8 ::FF2x2y8(){ note_ctor("_ZN3ccc7FF2x2y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y8E, buf);
    ::ccc::FF2x2y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y8E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y8E);
    dp->::ccc::FF2x2y8::~FF2x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y8E(Test__ZN3ccc7FF2x2y8E, "_ZN3ccc7FF2x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y8C1Ev();
extern void _ZN3ccc7FF2x2y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y8E[] = {
  NSPAIR(_ZN3ccc7FF2x2y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y8E[];
extern void _ZN3ccc7FF2x2y83efgEv();
extern void _ZN3ccc7FF2x2y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y8E[] = {
  {&(_ZTVN3ccc7FF2x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y8E[];
static VTBL_ENTRY alt_thunk_names521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y8E = {  "_ZN3ccc7FF2x2y8E", // class name
  bases__ZN3ccc7FF2x2y8E, 2,
  &(vtc__ZN3ccc7FF2x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names521,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y9  : virtual ::ccc::EE2x2 {
  virtual void  efg(); // _ZN3ccc7FF2x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x2y93pqrEv
  ~FF2x2y9(); // tgen
  FF2x2y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x2y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x2y93efgEv");}
void  ccc::FF2x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x2y93pqrEv");}
ccc::FF2x2y9 ::~FF2x2y9(){ note_dtor("_ZN3ccc7FF2x2y9E", this);} // tgen
ccc::FF2x2y9 ::FF2x2y9(){ note_ctor("_ZN3ccc7FF2x2y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x2y9E, buf);
    ::ccc::FF2x2y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x2y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y9E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc7FF2x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x2y9E);
    dp->::ccc::FF2x2y9::~FF2x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x2y9E(Test__ZN3ccc7FF2x2y9E, "_ZN3ccc7FF2x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x2y9C1Ev();
extern void _ZN3ccc7FF2x2y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x2y9E[] = {
  NSPAIR(_ZN3ccc7FF2x2y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc7FF2x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y9E[];
extern void _ZN3ccc7FF2x2y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x2y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x2y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x2y9E[] = {
  {&(_ZTVN3ccc7FF2x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x2y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_7FF2x2y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x2y9E[];
static VTBL_ENTRY alt_thunk_names522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x2y9E = {  "_ZN3ccc7FF2x2y9E", // class name
  bases__ZN3ccc7FF2x2y9E, 2,
  &(vtc__ZN3ccc7FF2x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x2y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x2y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x2y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x2y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names522,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y10  : virtual ::ccc::EE2x2 {
  virtual void  pqr(); // _ZN3ccc8FF2x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x2y103abcEv
  ~FF2x2y10(); // tgen
  FF2x2y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x2y103pqrEv");}
void  ccc::FF2x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x2y103abcEv");}
ccc::FF2x2y10 ::~FF2x2y10(){ note_dtor("_ZN3ccc8FF2x2y10E", this);} // tgen
ccc::FF2x2y10 ::FF2x2y10(){ note_ctor("_ZN3ccc8FF2x2y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y10E, buf);
    ::ccc::FF2x2y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y10E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y10E);
    dp->::ccc::FF2x2y10::~FF2x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y10E(Test__ZN3ccc8FF2x2y10E, "_ZN3ccc8FF2x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y10C1Ev();
extern void _ZN3ccc8FF2x2y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y10E[] = {
  NSPAIR(_ZN3ccc8FF2x2y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x2y103abcEv();
extern void _ZN3ccc8FF2x2y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y10E[] = {
  {&(_ZTVN3ccc8FF2x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y10E[];
static VTBL_ENTRY alt_thunk_names523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y10E = {  "_ZN3ccc8FF2x2y10E", // class name
  bases__ZN3ccc8FF2x2y10E, 2,
  &(vtc__ZN3ccc8FF2x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names523,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y11  : virtual ::ccc::EE2x2 {
  virtual void  pqr(); // _ZN3ccc8FF2x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x2y113efgEv
  ~FF2x2y11(); // tgen
  FF2x2y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x2y113pqrEv");}
void  ccc::FF2x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x2y113efgEv");}
ccc::FF2x2y11 ::~FF2x2y11(){ note_dtor("_ZN3ccc8FF2x2y11E", this);} // tgen
ccc::FF2x2y11 ::FF2x2y11(){ note_ctor("_ZN3ccc8FF2x2y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y11E, buf);
    ::ccc::FF2x2y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y11E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y11E);
    dp->::ccc::FF2x2y11::~FF2x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y11E(Test__ZN3ccc8FF2x2y11E, "_ZN3ccc8FF2x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y11C1Ev();
extern void _ZN3ccc8FF2x2y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y11E[] = {
  NSPAIR(_ZN3ccc8FF2x2y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y11E[];
extern void _ZN3ccc8FF2x2y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x2y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y11E[] = {
  {&(_ZTVN3ccc8FF2x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y11E[];
static VTBL_ENTRY alt_thunk_names524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y11E = {  "_ZN3ccc8FF2x2y11E", // class name
  bases__ZN3ccc8FF2x2y11E, 2,
  &(vtc__ZN3ccc8FF2x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names524,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y12  : virtual ::ccc::EE2x2 {
  virtual void  abc(); // _ZN3ccc8FF2x2y123abcEv
  ~FF2x2y12(); // tgen
  FF2x2y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x2y123abcEv");}
ccc::FF2x2y12 ::~FF2x2y12(){ note_dtor("_ZN3ccc8FF2x2y12E", this);} // tgen
ccc::FF2x2y12 ::FF2x2y12(){ note_ctor("_ZN3ccc8FF2x2y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y12E, buf);
    ::ccc::FF2x2y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y12E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y12E);
    dp->::ccc::FF2x2y12::~FF2x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y12E(Test__ZN3ccc8FF2x2y12E, "_ZN3ccc8FF2x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y12C1Ev();
extern void _ZN3ccc8FF2x2y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y12E[] = {
  NSPAIR(_ZN3ccc8FF2x2y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x2y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y12E[] = {
  {&(_ZTVN3ccc8FF2x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y12E[];
static VTBL_ENTRY alt_thunk_names525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y12E = {  "_ZN3ccc8FF2x2y12E", // class name
  bases__ZN3ccc8FF2x2y12E, 2,
  &(vtc__ZN3ccc8FF2x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names525,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y13  : virtual ::ccc::EE2x2 {
  virtual void  efg(); // _ZN3ccc8FF2x2y133efgEv
  ~FF2x2y13(); // tgen
  FF2x2y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x2y133efgEv");}
ccc::FF2x2y13 ::~FF2x2y13(){ note_dtor("_ZN3ccc8FF2x2y13E", this);} // tgen
ccc::FF2x2y13 ::FF2x2y13(){ note_ctor("_ZN3ccc8FF2x2y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y13E, buf);
    ::ccc::FF2x2y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y13E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y13E);
    dp->::ccc::FF2x2y13::~FF2x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y13E(Test__ZN3ccc8FF2x2y13E, "_ZN3ccc8FF2x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y13C1Ev();
extern void _ZN3ccc8FF2x2y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y13E[] = {
  NSPAIR(_ZN3ccc8FF2x2y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y13E[];
extern void _ZN3ccc8FF2x2y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y13E[] = {
  {&(_ZTVN3ccc8FF2x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y13E[];
static VTBL_ENTRY alt_thunk_names526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y13E = {  "_ZN3ccc8FF2x2y13E", // class name
  bases__ZN3ccc8FF2x2y13E, 2,
  &(vtc__ZN3ccc8FF2x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names526,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y14  : virtual ::ccc::EE2x2 {
  virtual void  pqr(); // _ZN3ccc8FF2x2y143pqrEv
  ~FF2x2y14(); // tgen
  FF2x2y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x2y143pqrEv");}
ccc::FF2x2y14 ::~FF2x2y14(){ note_dtor("_ZN3ccc8FF2x2y14E", this);} // tgen
ccc::FF2x2y14 ::FF2x2y14(){ note_ctor("_ZN3ccc8FF2x2y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y14E, buf);
    ::ccc::FF2x2y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y14E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y14E);
    dp->::ccc::FF2x2y14::~FF2x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y14E(Test__ZN3ccc8FF2x2y14E, "_ZN3ccc8FF2x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y14C1Ev();
extern void _ZN3ccc8FF2x2y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y14E[] = {
  NSPAIR(_ZN3ccc8FF2x2y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x2y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x2y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y14E[] = {
  {&(_ZTVN3ccc8FF2x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y14E[];
static VTBL_ENTRY alt_thunk_names527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y14E = {  "_ZN3ccc8FF2x2y14E", // class name
  bases__ZN3ccc8FF2x2y14E, 2,
  &(vtc__ZN3ccc8FF2x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names527,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x2y15  : virtual ::ccc::EE2x2 {
  ~FF2x2y15(); // tgen
  FF2x2y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x2y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x2y15 ::~FF2x2y15(){ note_dtor("_ZN3ccc8FF2x2y15E", this);} // tgen
ccc::FF2x2y15 ::FF2x2y15(){ note_ctor("_ZN3ccc8FF2x2y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x2y15E, buf);
    ::ccc::FF2x2y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x2y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y15E");
    check_base_class_offset(lv, (::ccc::EE2x2*), 0, "_ZN3ccc8FF2x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x2y15E);
    dp->::ccc::FF2x2y15::~FF2x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x2y15E(Test__ZN3ccc8FF2x2y15E, "_ZN3ccc8FF2x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x2y15C1Ev();
extern void _ZN3ccc8FF2x2y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x2y15E[] = {
  NSPAIR(_ZN3ccc8FF2x2y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x2E[];
static Base_Class bases__ZN3ccc8FF2x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x2y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv)();
extern void _ZN3ccc5EE2x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv)();
extern void _ZN3ccc5EE2x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv)();
extern void _ZN3ccc5EE2x23pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x2y15E[] = {
  {&(_ZTVN3ccc8FF2x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x2y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x2E__NS_8FF2x2y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x2y15E[];
static VTBL_ENTRY alt_thunk_names528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x23pqrEv,_ZTv0_n20_N3ccc5EE2x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x23abcEv,_ZTv0_n16_N3ccc5EE2x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x23efgEv,_ZTv0_n12_N3ccc5EE2x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x2y15E = {  "_ZN3ccc8FF2x2y15E", // class name
  bases__ZN3ccc8FF2x2y15E, 2,
  &(vtc__ZN3ccc8FF2x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x2y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x2y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x2y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x2y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names528,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y0  : virtual ::ccc::EE2x3 {
  virtual void  abc(); // _ZN3ccc7FF2x3y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y03pqrEv
  ~FF2x3y0(); // tgen
  FF2x3y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y03abcEv");}
void  ccc::FF2x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y03efgEv");}
void  ccc::FF2x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y03pqrEv");}
ccc::FF2x3y0 ::~FF2x3y0(){ note_dtor("_ZN3ccc7FF2x3y0E", this);} // tgen
ccc::FF2x3y0 ::FF2x3y0(){ note_ctor("_ZN3ccc7FF2x3y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y0E, buf);
    ::ccc::FF2x3y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y0E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y0E);
    dp->::ccc::FF2x3y0::~FF2x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y0E(Test__ZN3ccc7FF2x3y0E, "_ZN3ccc7FF2x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y0C1Ev();
extern void _ZN3ccc7FF2x3y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y0E[] = {
  NSPAIR(_ZN3ccc7FF2x3y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y0E[];
extern void _ZN3ccc7FF2x3y03efgEv();
extern void _ZN3ccc7FF2x3y03abcEv();
extern void _ZN3ccc7FF2x3y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y0E[] = {
  {&(_ZTVN3ccc7FF2x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y0E[];
static VTBL_ENTRY alt_thunk_names529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y0E = {  "_ZN3ccc7FF2x3y0E", // class name
  bases__ZN3ccc7FF2x3y0E, 2,
  &(vtc__ZN3ccc7FF2x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names529,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y1  : virtual ::ccc::EE2x3 {
  virtual void  abc(); // _ZN3ccc7FF2x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x3y13efgEv
  ~FF2x3y1(); // tgen
  FF2x3y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y13abcEv");}
void  ccc::FF2x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y13pqrEv");}
void  ccc::FF2x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y13efgEv");}
ccc::FF2x3y1 ::~FF2x3y1(){ note_dtor("_ZN3ccc7FF2x3y1E", this);} // tgen
ccc::FF2x3y1 ::FF2x3y1(){ note_ctor("_ZN3ccc7FF2x3y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y1E, buf);
    ::ccc::FF2x3y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y1E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y1E);
    dp->::ccc::FF2x3y1::~FF2x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y1E(Test__ZN3ccc7FF2x3y1E, "_ZN3ccc7FF2x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y1C1Ev();
extern void _ZN3ccc7FF2x3y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y1E[] = {
  NSPAIR(_ZN3ccc7FF2x3y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y1E[];
extern void _ZN3ccc7FF2x3y13efgEv();
extern void _ZN3ccc7FF2x3y13abcEv();
extern void _ZN3ccc7FF2x3y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y1E[] = {
  {&(_ZTVN3ccc7FF2x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y1E[];
static VTBL_ENTRY alt_thunk_names530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y1E = {  "_ZN3ccc7FF2x3y1E", // class name
  bases__ZN3ccc7FF2x3y1E, 2,
  &(vtc__ZN3ccc7FF2x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names530,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y2  : virtual ::ccc::EE2x3 {
  virtual void  efg(); // _ZN3ccc7FF2x3y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y23pqrEv
  ~FF2x3y2(); // tgen
  FF2x3y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y23efgEv");}
void  ccc::FF2x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y23abcEv");}
void  ccc::FF2x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y23pqrEv");}
ccc::FF2x3y2 ::~FF2x3y2(){ note_dtor("_ZN3ccc7FF2x3y2E", this);} // tgen
ccc::FF2x3y2 ::FF2x3y2(){ note_ctor("_ZN3ccc7FF2x3y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y2E, buf);
    ::ccc::FF2x3y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y2E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y2E);
    dp->::ccc::FF2x3y2::~FF2x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y2E(Test__ZN3ccc7FF2x3y2E, "_ZN3ccc7FF2x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y2C1Ev();
extern void _ZN3ccc7FF2x3y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y2E[] = {
  NSPAIR(_ZN3ccc7FF2x3y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y2E[];
extern void _ZN3ccc7FF2x3y23efgEv();
extern void _ZN3ccc7FF2x3y23abcEv();
extern void _ZN3ccc7FF2x3y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y2E[] = {
  {&(_ZTVN3ccc7FF2x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y2E[];
static VTBL_ENTRY alt_thunk_names531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y2E = {  "_ZN3ccc7FF2x3y2E", // class name
  bases__ZN3ccc7FF2x3y2E, 2,
  &(vtc__ZN3ccc7FF2x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names531,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y3  : virtual ::ccc::EE2x3 {
  virtual void  efg(); // _ZN3ccc7FF2x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x3y33abcEv
  ~FF2x3y3(); // tgen
  FF2x3y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y33efgEv");}
void  ccc::FF2x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y33pqrEv");}
void  ccc::FF2x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y33abcEv");}
ccc::FF2x3y3 ::~FF2x3y3(){ note_dtor("_ZN3ccc7FF2x3y3E", this);} // tgen
ccc::FF2x3y3 ::FF2x3y3(){ note_ctor("_ZN3ccc7FF2x3y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y3E, buf);
    ::ccc::FF2x3y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y3E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y3E);
    dp->::ccc::FF2x3y3::~FF2x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y3E(Test__ZN3ccc7FF2x3y3E, "_ZN3ccc7FF2x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y3C1Ev();
extern void _ZN3ccc7FF2x3y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y3E[] = {
  NSPAIR(_ZN3ccc7FF2x3y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y3E[];
extern void _ZN3ccc7FF2x3y33efgEv();
extern void _ZN3ccc7FF2x3y33abcEv();
extern void _ZN3ccc7FF2x3y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y3E[] = {
  {&(_ZTVN3ccc7FF2x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y3E[];
static VTBL_ENTRY alt_thunk_names532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y3E = {  "_ZN3ccc7FF2x3y3E", // class name
  bases__ZN3ccc7FF2x3y3E, 2,
  &(vtc__ZN3ccc7FF2x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names532,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y4  : virtual ::ccc::EE2x3 {
  virtual void  pqr(); // _ZN3ccc7FF2x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x3y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x3y43efgEv
  ~FF2x3y4(); // tgen
  FF2x3y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y43pqrEv");}
void  ccc::FF2x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y43abcEv");}
void  ccc::FF2x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y43efgEv");}
ccc::FF2x3y4 ::~FF2x3y4(){ note_dtor("_ZN3ccc7FF2x3y4E", this);} // tgen
ccc::FF2x3y4 ::FF2x3y4(){ note_ctor("_ZN3ccc7FF2x3y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y4E, buf);
    ::ccc::FF2x3y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y4E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y4E);
    dp->::ccc::FF2x3y4::~FF2x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y4E(Test__ZN3ccc7FF2x3y4E, "_ZN3ccc7FF2x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y4C1Ev();
extern void _ZN3ccc7FF2x3y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y4E[] = {
  NSPAIR(_ZN3ccc7FF2x3y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y4E[];
extern void _ZN3ccc7FF2x3y43efgEv();
extern void _ZN3ccc7FF2x3y43abcEv();
extern void _ZN3ccc7FF2x3y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y4E[] = {
  {&(_ZTVN3ccc7FF2x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y4E[];
static VTBL_ENTRY alt_thunk_names533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y4E = {  "_ZN3ccc7FF2x3y4E", // class name
  bases__ZN3ccc7FF2x3y4E, 2,
  &(vtc__ZN3ccc7FF2x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names533,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y5  : virtual ::ccc::EE2x3 {
  virtual void  pqr(); // _ZN3ccc7FF2x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x3y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x3y53abcEv
  ~FF2x3y5(); // tgen
  FF2x3y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y53pqrEv");}
void  ccc::FF2x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y53efgEv");}
void  ccc::FF2x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y53abcEv");}
ccc::FF2x3y5 ::~FF2x3y5(){ note_dtor("_ZN3ccc7FF2x3y5E", this);} // tgen
ccc::FF2x3y5 ::FF2x3y5(){ note_ctor("_ZN3ccc7FF2x3y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y5E, buf);
    ::ccc::FF2x3y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y5E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y5E);
    dp->::ccc::FF2x3y5::~FF2x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y5E(Test__ZN3ccc7FF2x3y5E, "_ZN3ccc7FF2x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y5C1Ev();
extern void _ZN3ccc7FF2x3y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y5E[] = {
  NSPAIR(_ZN3ccc7FF2x3y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y5E[];
extern void _ZN3ccc7FF2x3y53efgEv();
extern void _ZN3ccc7FF2x3y53abcEv();
extern void _ZN3ccc7FF2x3y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y5E[] = {
  {&(_ZTVN3ccc7FF2x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y5E[];
static VTBL_ENTRY alt_thunk_names534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y5E = {  "_ZN3ccc7FF2x3y5E", // class name
  bases__ZN3ccc7FF2x3y5E, 2,
  &(vtc__ZN3ccc7FF2x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names534,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y6  : virtual ::ccc::EE2x3 {
  virtual void  abc(); // _ZN3ccc7FF2x3y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x3y63efgEv
  ~FF2x3y6(); // tgen
  FF2x3y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y63abcEv");}
void  ccc::FF2x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y63efgEv");}
ccc::FF2x3y6 ::~FF2x3y6(){ note_dtor("_ZN3ccc7FF2x3y6E", this);} // tgen
ccc::FF2x3y6 ::FF2x3y6(){ note_ctor("_ZN3ccc7FF2x3y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y6E, buf);
    ::ccc::FF2x3y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y6E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y6E);
    dp->::ccc::FF2x3y6::~FF2x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y6E(Test__ZN3ccc7FF2x3y6E, "_ZN3ccc7FF2x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y6C1Ev();
extern void _ZN3ccc7FF2x3y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y6E[] = {
  NSPAIR(_ZN3ccc7FF2x3y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y6E[];
extern void _ZN3ccc7FF2x3y63efgEv();
extern void _ZN3ccc7FF2x3y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y6E[] = {
  {&(_ZTVN3ccc7FF2x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y6E[];
static VTBL_ENTRY alt_thunk_names535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y6E = {  "_ZN3ccc7FF2x3y6E", // class name
  bases__ZN3ccc7FF2x3y6E, 2,
  &(vtc__ZN3ccc7FF2x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names535,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y7  : virtual ::ccc::EE2x3 {
  virtual void  abc(); // _ZN3ccc7FF2x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y73pqrEv
  ~FF2x3y7(); // tgen
  FF2x3y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y73abcEv");}
void  ccc::FF2x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y73pqrEv");}
ccc::FF2x3y7 ::~FF2x3y7(){ note_dtor("_ZN3ccc7FF2x3y7E", this);} // tgen
ccc::FF2x3y7 ::FF2x3y7(){ note_ctor("_ZN3ccc7FF2x3y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y7E, buf);
    ::ccc::FF2x3y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y7E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y7E);
    dp->::ccc::FF2x3y7::~FF2x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y7E(Test__ZN3ccc7FF2x3y7E, "_ZN3ccc7FF2x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y7C1Ev();
extern void _ZN3ccc7FF2x3y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y7E[] = {
  NSPAIR(_ZN3ccc7FF2x3y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x3y73abcEv();
extern void _ZN3ccc7FF2x3y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y7E[] = {
  {&(_ZTVN3ccc7FF2x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y7E[];
static VTBL_ENTRY alt_thunk_names536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y7E = {  "_ZN3ccc7FF2x3y7E", // class name
  bases__ZN3ccc7FF2x3y7E, 2,
  &(vtc__ZN3ccc7FF2x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names536,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y8  : virtual ::ccc::EE2x3 {
  virtual void  efg(); // _ZN3ccc7FF2x3y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x3y83abcEv
  ~FF2x3y8(); // tgen
  FF2x3y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y83efgEv");}
void  ccc::FF2x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x3y83abcEv");}
ccc::FF2x3y8 ::~FF2x3y8(){ note_dtor("_ZN3ccc7FF2x3y8E", this);} // tgen
ccc::FF2x3y8 ::FF2x3y8(){ note_ctor("_ZN3ccc7FF2x3y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y8E, buf);
    ::ccc::FF2x3y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y8E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y8E);
    dp->::ccc::FF2x3y8::~FF2x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y8E(Test__ZN3ccc7FF2x3y8E, "_ZN3ccc7FF2x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y8C1Ev();
extern void _ZN3ccc7FF2x3y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y8E[] = {
  NSPAIR(_ZN3ccc7FF2x3y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y8E[];
extern void _ZN3ccc7FF2x3y83efgEv();
extern void _ZN3ccc7FF2x3y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y8E[] = {
  {&(_ZTVN3ccc7FF2x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y8E[];
static VTBL_ENTRY alt_thunk_names537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y8E = {  "_ZN3ccc7FF2x3y8E", // class name
  bases__ZN3ccc7FF2x3y8E, 2,
  &(vtc__ZN3ccc7FF2x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names537,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y9  : virtual ::ccc::EE2x3 {
  virtual void  efg(); // _ZN3ccc7FF2x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x3y93pqrEv
  ~FF2x3y9(); // tgen
  FF2x3y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x3y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x3y93efgEv");}
void  ccc::FF2x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x3y93pqrEv");}
ccc::FF2x3y9 ::~FF2x3y9(){ note_dtor("_ZN3ccc7FF2x3y9E", this);} // tgen
ccc::FF2x3y9 ::FF2x3y9(){ note_ctor("_ZN3ccc7FF2x3y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x3y9E, buf);
    ::ccc::FF2x3y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x3y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y9E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc7FF2x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x3y9E);
    dp->::ccc::FF2x3y9::~FF2x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x3y9E(Test__ZN3ccc7FF2x3y9E, "_ZN3ccc7FF2x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x3y9C1Ev();
extern void _ZN3ccc7FF2x3y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x3y9E[] = {
  NSPAIR(_ZN3ccc7FF2x3y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc7FF2x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y9E[];
extern void _ZN3ccc7FF2x3y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x3y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x3y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x3y9E[] = {
  {&(_ZTVN3ccc7FF2x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x3y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_7FF2x3y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x3y9E[];
static VTBL_ENTRY alt_thunk_names538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x3y9E = {  "_ZN3ccc7FF2x3y9E", // class name
  bases__ZN3ccc7FF2x3y9E, 2,
  &(vtc__ZN3ccc7FF2x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x3y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x3y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x3y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x3y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names538,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y10  : virtual ::ccc::EE2x3 {
  virtual void  pqr(); // _ZN3ccc8FF2x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x3y103abcEv
  ~FF2x3y10(); // tgen
  FF2x3y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x3y103pqrEv");}
void  ccc::FF2x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x3y103abcEv");}
ccc::FF2x3y10 ::~FF2x3y10(){ note_dtor("_ZN3ccc8FF2x3y10E", this);} // tgen
ccc::FF2x3y10 ::FF2x3y10(){ note_ctor("_ZN3ccc8FF2x3y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y10E, buf);
    ::ccc::FF2x3y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y10E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y10E);
    dp->::ccc::FF2x3y10::~FF2x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y10E(Test__ZN3ccc8FF2x3y10E, "_ZN3ccc8FF2x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y10C1Ev();
extern void _ZN3ccc8FF2x3y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y10E[] = {
  NSPAIR(_ZN3ccc8FF2x3y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x3y103abcEv();
extern void _ZN3ccc8FF2x3y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y10E[] = {
  {&(_ZTVN3ccc8FF2x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y10E[];
static VTBL_ENTRY alt_thunk_names539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y10E = {  "_ZN3ccc8FF2x3y10E", // class name
  bases__ZN3ccc8FF2x3y10E, 2,
  &(vtc__ZN3ccc8FF2x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names539,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y11  : virtual ::ccc::EE2x3 {
  virtual void  pqr(); // _ZN3ccc8FF2x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x3y113efgEv
  ~FF2x3y11(); // tgen
  FF2x3y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x3y113pqrEv");}
void  ccc::FF2x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x3y113efgEv");}
ccc::FF2x3y11 ::~FF2x3y11(){ note_dtor("_ZN3ccc8FF2x3y11E", this);} // tgen
ccc::FF2x3y11 ::FF2x3y11(){ note_ctor("_ZN3ccc8FF2x3y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y11E, buf);
    ::ccc::FF2x3y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y11E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y11E);
    dp->::ccc::FF2x3y11::~FF2x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y11E(Test__ZN3ccc8FF2x3y11E, "_ZN3ccc8FF2x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y11C1Ev();
extern void _ZN3ccc8FF2x3y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y11E[] = {
  NSPAIR(_ZN3ccc8FF2x3y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y11E[];
extern void _ZN3ccc8FF2x3y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x3y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y11E[] = {
  {&(_ZTVN3ccc8FF2x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y11E[];
static VTBL_ENTRY alt_thunk_names540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y11E = {  "_ZN3ccc8FF2x3y11E", // class name
  bases__ZN3ccc8FF2x3y11E, 2,
  &(vtc__ZN3ccc8FF2x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names540,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y12  : virtual ::ccc::EE2x3 {
  virtual void  abc(); // _ZN3ccc8FF2x3y123abcEv
  ~FF2x3y12(); // tgen
  FF2x3y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x3y123abcEv");}
ccc::FF2x3y12 ::~FF2x3y12(){ note_dtor("_ZN3ccc8FF2x3y12E", this);} // tgen
ccc::FF2x3y12 ::FF2x3y12(){ note_ctor("_ZN3ccc8FF2x3y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y12E, buf);
    ::ccc::FF2x3y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y12E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y12E);
    dp->::ccc::FF2x3y12::~FF2x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y12E(Test__ZN3ccc8FF2x3y12E, "_ZN3ccc8FF2x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y12C1Ev();
extern void _ZN3ccc8FF2x3y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y12E[] = {
  NSPAIR(_ZN3ccc8FF2x3y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x3y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y12E[] = {
  {&(_ZTVN3ccc8FF2x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y12E[];
static VTBL_ENTRY alt_thunk_names541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y12E = {  "_ZN3ccc8FF2x3y12E", // class name
  bases__ZN3ccc8FF2x3y12E, 2,
  &(vtc__ZN3ccc8FF2x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names541,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y13  : virtual ::ccc::EE2x3 {
  virtual void  efg(); // _ZN3ccc8FF2x3y133efgEv
  ~FF2x3y13(); // tgen
  FF2x3y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x3y133efgEv");}
ccc::FF2x3y13 ::~FF2x3y13(){ note_dtor("_ZN3ccc8FF2x3y13E", this);} // tgen
ccc::FF2x3y13 ::FF2x3y13(){ note_ctor("_ZN3ccc8FF2x3y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y13E, buf);
    ::ccc::FF2x3y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y13E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y13E);
    dp->::ccc::FF2x3y13::~FF2x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y13E(Test__ZN3ccc8FF2x3y13E, "_ZN3ccc8FF2x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y13C1Ev();
extern void _ZN3ccc8FF2x3y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y13E[] = {
  NSPAIR(_ZN3ccc8FF2x3y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y13E[];
extern void _ZN3ccc8FF2x3y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y13E[] = {
  {&(_ZTVN3ccc8FF2x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y13E[];
static VTBL_ENTRY alt_thunk_names542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y13E = {  "_ZN3ccc8FF2x3y13E", // class name
  bases__ZN3ccc8FF2x3y13E, 2,
  &(vtc__ZN3ccc8FF2x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names542,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y14  : virtual ::ccc::EE2x3 {
  virtual void  pqr(); // _ZN3ccc8FF2x3y143pqrEv
  ~FF2x3y14(); // tgen
  FF2x3y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x3y143pqrEv");}
ccc::FF2x3y14 ::~FF2x3y14(){ note_dtor("_ZN3ccc8FF2x3y14E", this);} // tgen
ccc::FF2x3y14 ::FF2x3y14(){ note_ctor("_ZN3ccc8FF2x3y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y14E, buf);
    ::ccc::FF2x3y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y14E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y14E);
    dp->::ccc::FF2x3y14::~FF2x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y14E(Test__ZN3ccc8FF2x3y14E, "_ZN3ccc8FF2x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y14C1Ev();
extern void _ZN3ccc8FF2x3y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y14E[] = {
  NSPAIR(_ZN3ccc8FF2x3y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x3y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x3y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y14E[] = {
  {&(_ZTVN3ccc8FF2x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y14E[];
static VTBL_ENTRY alt_thunk_names543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y14E = {  "_ZN3ccc8FF2x3y14E", // class name
  bases__ZN3ccc8FF2x3y14E, 2,
  &(vtc__ZN3ccc8FF2x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names543,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x3y15  : virtual ::ccc::EE2x3 {
  ~FF2x3y15(); // tgen
  FF2x3y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x3y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x3y15 ::~FF2x3y15(){ note_dtor("_ZN3ccc8FF2x3y15E", this);} // tgen
ccc::FF2x3y15 ::FF2x3y15(){ note_ctor("_ZN3ccc8FF2x3y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x3y15E, buf);
    ::ccc::FF2x3y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x3y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y15E");
    check_base_class_offset(lv, (::ccc::EE2x3*), 0, "_ZN3ccc8FF2x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x3y15E);
    dp->::ccc::FF2x3y15::~FF2x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x3y15E(Test__ZN3ccc8FF2x3y15E, "_ZN3ccc8FF2x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x3y15C1Ev();
extern void _ZN3ccc8FF2x3y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x3y15E[] = {
  NSPAIR(_ZN3ccc8FF2x3y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x3E[];
static Base_Class bases__ZN3ccc8FF2x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x3y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv)();
extern void _ZN3ccc5EE2x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv)();
extern void _ZN3ccc5EE2x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv)();
extern void _ZN3ccc5EE2x33pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x3y15E[] = {
  {&(_ZTVN3ccc8FF2x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x3y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x3E__NS_8FF2x3y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x3y15E[];
static VTBL_ENTRY alt_thunk_names544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x33pqrEv,_ZTv0_n20_N3ccc5EE2x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x33abcEv,_ZTv0_n16_N3ccc5EE2x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x33efgEv,_ZTv0_n12_N3ccc5EE2x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x3y15E = {  "_ZN3ccc8FF2x3y15E", // class name
  bases__ZN3ccc8FF2x3y15E, 2,
  &(vtc__ZN3ccc8FF2x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x3y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x3y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x3y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x3y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names544,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y0  : virtual ::ccc::EE2x4 {
  virtual void  abc(); // _ZN3ccc7FF2x4y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y03pqrEv
  ~FF2x4y0(); // tgen
  FF2x4y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y03abcEv");}
void  ccc::FF2x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y03efgEv");}
void  ccc::FF2x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y03pqrEv");}
ccc::FF2x4y0 ::~FF2x4y0(){ note_dtor("_ZN3ccc7FF2x4y0E", this);} // tgen
ccc::FF2x4y0 ::FF2x4y0(){ note_ctor("_ZN3ccc7FF2x4y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y0E, buf);
    ::ccc::FF2x4y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y0E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y0E);
    dp->::ccc::FF2x4y0::~FF2x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y0E(Test__ZN3ccc7FF2x4y0E, "_ZN3ccc7FF2x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y0C1Ev();
extern void _ZN3ccc7FF2x4y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y0E[] = {
  NSPAIR(_ZN3ccc7FF2x4y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y0E[];
extern void _ZN3ccc7FF2x4y03efgEv();
extern void _ZN3ccc7FF2x4y03abcEv();
extern void _ZN3ccc7FF2x4y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y0E[] = {
  {&(_ZTVN3ccc7FF2x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y0E[];
static VTBL_ENTRY alt_thunk_names545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y0E = {  "_ZN3ccc7FF2x4y0E", // class name
  bases__ZN3ccc7FF2x4y0E, 2,
  &(vtc__ZN3ccc7FF2x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names545,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y1  : virtual ::ccc::EE2x4 {
  virtual void  abc(); // _ZN3ccc7FF2x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x4y13efgEv
  ~FF2x4y1(); // tgen
  FF2x4y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y13abcEv");}
void  ccc::FF2x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y13pqrEv");}
void  ccc::FF2x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y13efgEv");}
ccc::FF2x4y1 ::~FF2x4y1(){ note_dtor("_ZN3ccc7FF2x4y1E", this);} // tgen
ccc::FF2x4y1 ::FF2x4y1(){ note_ctor("_ZN3ccc7FF2x4y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y1E, buf);
    ::ccc::FF2x4y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y1E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y1E);
    dp->::ccc::FF2x4y1::~FF2x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y1E(Test__ZN3ccc7FF2x4y1E, "_ZN3ccc7FF2x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y1C1Ev();
extern void _ZN3ccc7FF2x4y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y1E[] = {
  NSPAIR(_ZN3ccc7FF2x4y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y1E[];
extern void _ZN3ccc7FF2x4y13efgEv();
extern void _ZN3ccc7FF2x4y13abcEv();
extern void _ZN3ccc7FF2x4y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y1E[] = {
  {&(_ZTVN3ccc7FF2x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y1E[];
static VTBL_ENTRY alt_thunk_names546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y1E = {  "_ZN3ccc7FF2x4y1E", // class name
  bases__ZN3ccc7FF2x4y1E, 2,
  &(vtc__ZN3ccc7FF2x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names546,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y2  : virtual ::ccc::EE2x4 {
  virtual void  efg(); // _ZN3ccc7FF2x4y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y23pqrEv
  ~FF2x4y2(); // tgen
  FF2x4y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y23efgEv");}
void  ccc::FF2x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y23abcEv");}
void  ccc::FF2x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y23pqrEv");}
ccc::FF2x4y2 ::~FF2x4y2(){ note_dtor("_ZN3ccc7FF2x4y2E", this);} // tgen
ccc::FF2x4y2 ::FF2x4y2(){ note_ctor("_ZN3ccc7FF2x4y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y2E, buf);
    ::ccc::FF2x4y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y2E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y2E);
    dp->::ccc::FF2x4y2::~FF2x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y2E(Test__ZN3ccc7FF2x4y2E, "_ZN3ccc7FF2x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y2C1Ev();
extern void _ZN3ccc7FF2x4y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y2E[] = {
  NSPAIR(_ZN3ccc7FF2x4y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y2E[];
extern void _ZN3ccc7FF2x4y23efgEv();
extern void _ZN3ccc7FF2x4y23abcEv();
extern void _ZN3ccc7FF2x4y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y2E[] = {
  {&(_ZTVN3ccc7FF2x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y2E[];
static VTBL_ENTRY alt_thunk_names547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y2E = {  "_ZN3ccc7FF2x4y2E", // class name
  bases__ZN3ccc7FF2x4y2E, 2,
  &(vtc__ZN3ccc7FF2x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names547,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y3  : virtual ::ccc::EE2x4 {
  virtual void  efg(); // _ZN3ccc7FF2x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x4y33abcEv
  ~FF2x4y3(); // tgen
  FF2x4y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y33efgEv");}
void  ccc::FF2x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y33pqrEv");}
void  ccc::FF2x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y33abcEv");}
ccc::FF2x4y3 ::~FF2x4y3(){ note_dtor("_ZN3ccc7FF2x4y3E", this);} // tgen
ccc::FF2x4y3 ::FF2x4y3(){ note_ctor("_ZN3ccc7FF2x4y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y3E, buf);
    ::ccc::FF2x4y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y3E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y3E);
    dp->::ccc::FF2x4y3::~FF2x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y3E(Test__ZN3ccc7FF2x4y3E, "_ZN3ccc7FF2x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y3C1Ev();
extern void _ZN3ccc7FF2x4y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y3E[] = {
  NSPAIR(_ZN3ccc7FF2x4y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y3E[];
extern void _ZN3ccc7FF2x4y33efgEv();
extern void _ZN3ccc7FF2x4y33abcEv();
extern void _ZN3ccc7FF2x4y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y3E[] = {
  {&(_ZTVN3ccc7FF2x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y3E[];
static VTBL_ENTRY alt_thunk_names548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y3E = {  "_ZN3ccc7FF2x4y3E", // class name
  bases__ZN3ccc7FF2x4y3E, 2,
  &(vtc__ZN3ccc7FF2x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names548,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y4  : virtual ::ccc::EE2x4 {
  virtual void  pqr(); // _ZN3ccc7FF2x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x4y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x4y43efgEv
  ~FF2x4y4(); // tgen
  FF2x4y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y43pqrEv");}
void  ccc::FF2x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y43abcEv");}
void  ccc::FF2x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y43efgEv");}
ccc::FF2x4y4 ::~FF2x4y4(){ note_dtor("_ZN3ccc7FF2x4y4E", this);} // tgen
ccc::FF2x4y4 ::FF2x4y4(){ note_ctor("_ZN3ccc7FF2x4y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y4E, buf);
    ::ccc::FF2x4y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y4E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y4E);
    dp->::ccc::FF2x4y4::~FF2x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y4E(Test__ZN3ccc7FF2x4y4E, "_ZN3ccc7FF2x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y4C1Ev();
extern void _ZN3ccc7FF2x4y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y4E[] = {
  NSPAIR(_ZN3ccc7FF2x4y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y4E[];
extern void _ZN3ccc7FF2x4y43efgEv();
extern void _ZN3ccc7FF2x4y43abcEv();
extern void _ZN3ccc7FF2x4y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y4E[] = {
  {&(_ZTVN3ccc7FF2x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y4E[];
static VTBL_ENTRY alt_thunk_names549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y4E = {  "_ZN3ccc7FF2x4y4E", // class name
  bases__ZN3ccc7FF2x4y4E, 2,
  &(vtc__ZN3ccc7FF2x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names549,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y5  : virtual ::ccc::EE2x4 {
  virtual void  pqr(); // _ZN3ccc7FF2x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x4y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x4y53abcEv
  ~FF2x4y5(); // tgen
  FF2x4y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y53pqrEv");}
void  ccc::FF2x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y53efgEv");}
void  ccc::FF2x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y53abcEv");}
ccc::FF2x4y5 ::~FF2x4y5(){ note_dtor("_ZN3ccc7FF2x4y5E", this);} // tgen
ccc::FF2x4y5 ::FF2x4y5(){ note_ctor("_ZN3ccc7FF2x4y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y5E, buf);
    ::ccc::FF2x4y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y5E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y5E);
    dp->::ccc::FF2x4y5::~FF2x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y5E(Test__ZN3ccc7FF2x4y5E, "_ZN3ccc7FF2x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y5C1Ev();
extern void _ZN3ccc7FF2x4y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y5E[] = {
  NSPAIR(_ZN3ccc7FF2x4y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y5E[];
extern void _ZN3ccc7FF2x4y53efgEv();
extern void _ZN3ccc7FF2x4y53abcEv();
extern void _ZN3ccc7FF2x4y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y5E[] = {
  {&(_ZTVN3ccc7FF2x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y5E[];
static VTBL_ENTRY alt_thunk_names550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y5E = {  "_ZN3ccc7FF2x4y5E", // class name
  bases__ZN3ccc7FF2x4y5E, 2,
  &(vtc__ZN3ccc7FF2x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names550,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y6  : virtual ::ccc::EE2x4 {
  virtual void  abc(); // _ZN3ccc7FF2x4y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x4y63efgEv
  ~FF2x4y6(); // tgen
  FF2x4y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y63abcEv");}
void  ccc::FF2x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y63efgEv");}
ccc::FF2x4y6 ::~FF2x4y6(){ note_dtor("_ZN3ccc7FF2x4y6E", this);} // tgen
ccc::FF2x4y6 ::FF2x4y6(){ note_ctor("_ZN3ccc7FF2x4y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y6E, buf);
    ::ccc::FF2x4y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y6E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y6E);
    dp->::ccc::FF2x4y6::~FF2x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y6E(Test__ZN3ccc7FF2x4y6E, "_ZN3ccc7FF2x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y6C1Ev();
extern void _ZN3ccc7FF2x4y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y6E[] = {
  NSPAIR(_ZN3ccc7FF2x4y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y6E[];
extern void _ZN3ccc7FF2x4y63efgEv();
extern void _ZN3ccc7FF2x4y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y6E[] = {
  {&(_ZTVN3ccc7FF2x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y6E[];
static VTBL_ENTRY alt_thunk_names551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y6E = {  "_ZN3ccc7FF2x4y6E", // class name
  bases__ZN3ccc7FF2x4y6E, 2,
  &(vtc__ZN3ccc7FF2x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names551,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y7  : virtual ::ccc::EE2x4 {
  virtual void  abc(); // _ZN3ccc7FF2x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y73pqrEv
  ~FF2x4y7(); // tgen
  FF2x4y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y73abcEv");}
void  ccc::FF2x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y73pqrEv");}
ccc::FF2x4y7 ::~FF2x4y7(){ note_dtor("_ZN3ccc7FF2x4y7E", this);} // tgen
ccc::FF2x4y7 ::FF2x4y7(){ note_ctor("_ZN3ccc7FF2x4y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y7E, buf);
    ::ccc::FF2x4y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y7E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y7E);
    dp->::ccc::FF2x4y7::~FF2x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y7E(Test__ZN3ccc7FF2x4y7E, "_ZN3ccc7FF2x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y7C1Ev();
extern void _ZN3ccc7FF2x4y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y7E[] = {
  NSPAIR(_ZN3ccc7FF2x4y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x4y73abcEv();
extern void _ZN3ccc7FF2x4y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y7E[] = {
  {&(_ZTVN3ccc7FF2x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y7E[];
static VTBL_ENTRY alt_thunk_names552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y7E = {  "_ZN3ccc7FF2x4y7E", // class name
  bases__ZN3ccc7FF2x4y7E, 2,
  &(vtc__ZN3ccc7FF2x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names552,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y8  : virtual ::ccc::EE2x4 {
  virtual void  efg(); // _ZN3ccc7FF2x4y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x4y83abcEv
  ~FF2x4y8(); // tgen
  FF2x4y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y83efgEv");}
void  ccc::FF2x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x4y83abcEv");}
ccc::FF2x4y8 ::~FF2x4y8(){ note_dtor("_ZN3ccc7FF2x4y8E", this);} // tgen
ccc::FF2x4y8 ::FF2x4y8(){ note_ctor("_ZN3ccc7FF2x4y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y8E, buf);
    ::ccc::FF2x4y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y8E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y8E);
    dp->::ccc::FF2x4y8::~FF2x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y8E(Test__ZN3ccc7FF2x4y8E, "_ZN3ccc7FF2x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y8C1Ev();
extern void _ZN3ccc7FF2x4y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y8E[] = {
  NSPAIR(_ZN3ccc7FF2x4y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y8E[];
extern void _ZN3ccc7FF2x4y83efgEv();
extern void _ZN3ccc7FF2x4y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y8E[] = {
  {&(_ZTVN3ccc7FF2x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y8E[];
static VTBL_ENTRY alt_thunk_names553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y8E = {  "_ZN3ccc7FF2x4y8E", // class name
  bases__ZN3ccc7FF2x4y8E, 2,
  &(vtc__ZN3ccc7FF2x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names553,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y9  : virtual ::ccc::EE2x4 {
  virtual void  efg(); // _ZN3ccc7FF2x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x4y93pqrEv
  ~FF2x4y9(); // tgen
  FF2x4y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x4y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x4y93efgEv");}
void  ccc::FF2x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x4y93pqrEv");}
ccc::FF2x4y9 ::~FF2x4y9(){ note_dtor("_ZN3ccc7FF2x4y9E", this);} // tgen
ccc::FF2x4y9 ::FF2x4y9(){ note_ctor("_ZN3ccc7FF2x4y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x4y9E, buf);
    ::ccc::FF2x4y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x4y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y9E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc7FF2x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x4y9E);
    dp->::ccc::FF2x4y9::~FF2x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x4y9E(Test__ZN3ccc7FF2x4y9E, "_ZN3ccc7FF2x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x4y9C1Ev();
extern void _ZN3ccc7FF2x4y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x4y9E[] = {
  NSPAIR(_ZN3ccc7FF2x4y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc7FF2x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y9E[];
extern void _ZN3ccc7FF2x4y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x4y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x4y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x4y9E[] = {
  {&(_ZTVN3ccc7FF2x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x4y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_7FF2x4y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x4y9E[];
static VTBL_ENTRY alt_thunk_names554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x4y9E = {  "_ZN3ccc7FF2x4y9E", // class name
  bases__ZN3ccc7FF2x4y9E, 2,
  &(vtc__ZN3ccc7FF2x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x4y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x4y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x4y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x4y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names554,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y10  : virtual ::ccc::EE2x4 {
  virtual void  pqr(); // _ZN3ccc8FF2x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x4y103abcEv
  ~FF2x4y10(); // tgen
  FF2x4y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x4y103pqrEv");}
void  ccc::FF2x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x4y103abcEv");}
ccc::FF2x4y10 ::~FF2x4y10(){ note_dtor("_ZN3ccc8FF2x4y10E", this);} // tgen
ccc::FF2x4y10 ::FF2x4y10(){ note_ctor("_ZN3ccc8FF2x4y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y10E, buf);
    ::ccc::FF2x4y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y10E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y10E);
    dp->::ccc::FF2x4y10::~FF2x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y10E(Test__ZN3ccc8FF2x4y10E, "_ZN3ccc8FF2x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y10C1Ev();
extern void _ZN3ccc8FF2x4y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y10E[] = {
  NSPAIR(_ZN3ccc8FF2x4y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x4y103abcEv();
extern void _ZN3ccc8FF2x4y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y10E[] = {
  {&(_ZTVN3ccc8FF2x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y10E[];
static VTBL_ENTRY alt_thunk_names555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y10E = {  "_ZN3ccc8FF2x4y10E", // class name
  bases__ZN3ccc8FF2x4y10E, 2,
  &(vtc__ZN3ccc8FF2x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names555,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y11  : virtual ::ccc::EE2x4 {
  virtual void  pqr(); // _ZN3ccc8FF2x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x4y113efgEv
  ~FF2x4y11(); // tgen
  FF2x4y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x4y113pqrEv");}
void  ccc::FF2x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x4y113efgEv");}
ccc::FF2x4y11 ::~FF2x4y11(){ note_dtor("_ZN3ccc8FF2x4y11E", this);} // tgen
ccc::FF2x4y11 ::FF2x4y11(){ note_ctor("_ZN3ccc8FF2x4y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y11E, buf);
    ::ccc::FF2x4y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y11E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y11E);
    dp->::ccc::FF2x4y11::~FF2x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y11E(Test__ZN3ccc8FF2x4y11E, "_ZN3ccc8FF2x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y11C1Ev();
extern void _ZN3ccc8FF2x4y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y11E[] = {
  NSPAIR(_ZN3ccc8FF2x4y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y11E[];
extern void _ZN3ccc8FF2x4y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x4y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y11E[] = {
  {&(_ZTVN3ccc8FF2x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y11E[];
static VTBL_ENTRY alt_thunk_names556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y11E = {  "_ZN3ccc8FF2x4y11E", // class name
  bases__ZN3ccc8FF2x4y11E, 2,
  &(vtc__ZN3ccc8FF2x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names556,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y12  : virtual ::ccc::EE2x4 {
  virtual void  abc(); // _ZN3ccc8FF2x4y123abcEv
  ~FF2x4y12(); // tgen
  FF2x4y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x4y123abcEv");}
ccc::FF2x4y12 ::~FF2x4y12(){ note_dtor("_ZN3ccc8FF2x4y12E", this);} // tgen
ccc::FF2x4y12 ::FF2x4y12(){ note_ctor("_ZN3ccc8FF2x4y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y12E, buf);
    ::ccc::FF2x4y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y12E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y12E);
    dp->::ccc::FF2x4y12::~FF2x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y12E(Test__ZN3ccc8FF2x4y12E, "_ZN3ccc8FF2x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y12C1Ev();
extern void _ZN3ccc8FF2x4y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y12E[] = {
  NSPAIR(_ZN3ccc8FF2x4y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x4y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y12E[] = {
  {&(_ZTVN3ccc8FF2x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y12E[];
static VTBL_ENTRY alt_thunk_names557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y12E = {  "_ZN3ccc8FF2x4y12E", // class name
  bases__ZN3ccc8FF2x4y12E, 2,
  &(vtc__ZN3ccc8FF2x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names557,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y13  : virtual ::ccc::EE2x4 {
  virtual void  efg(); // _ZN3ccc8FF2x4y133efgEv
  ~FF2x4y13(); // tgen
  FF2x4y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x4y133efgEv");}
ccc::FF2x4y13 ::~FF2x4y13(){ note_dtor("_ZN3ccc8FF2x4y13E", this);} // tgen
ccc::FF2x4y13 ::FF2x4y13(){ note_ctor("_ZN3ccc8FF2x4y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y13E, buf);
    ::ccc::FF2x4y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y13E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y13E);
    dp->::ccc::FF2x4y13::~FF2x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y13E(Test__ZN3ccc8FF2x4y13E, "_ZN3ccc8FF2x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y13C1Ev();
extern void _ZN3ccc8FF2x4y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y13E[] = {
  NSPAIR(_ZN3ccc8FF2x4y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y13E[];
extern void _ZN3ccc8FF2x4y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y13E[] = {
  {&(_ZTVN3ccc8FF2x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y13E[];
static VTBL_ENTRY alt_thunk_names558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y13E = {  "_ZN3ccc8FF2x4y13E", // class name
  bases__ZN3ccc8FF2x4y13E, 2,
  &(vtc__ZN3ccc8FF2x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names558,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y14  : virtual ::ccc::EE2x4 {
  virtual void  pqr(); // _ZN3ccc8FF2x4y143pqrEv
  ~FF2x4y14(); // tgen
  FF2x4y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x4y143pqrEv");}
ccc::FF2x4y14 ::~FF2x4y14(){ note_dtor("_ZN3ccc8FF2x4y14E", this);} // tgen
ccc::FF2x4y14 ::FF2x4y14(){ note_ctor("_ZN3ccc8FF2x4y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y14E, buf);
    ::ccc::FF2x4y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y14E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y14E);
    dp->::ccc::FF2x4y14::~FF2x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y14E(Test__ZN3ccc8FF2x4y14E, "_ZN3ccc8FF2x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y14C1Ev();
extern void _ZN3ccc8FF2x4y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y14E[] = {
  NSPAIR(_ZN3ccc8FF2x4y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x4y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x4y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y14E[] = {
  {&(_ZTVN3ccc8FF2x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y14E[];
static VTBL_ENTRY alt_thunk_names559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y14E = {  "_ZN3ccc8FF2x4y14E", // class name
  bases__ZN3ccc8FF2x4y14E, 2,
  &(vtc__ZN3ccc8FF2x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names559,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x4y15  : virtual ::ccc::EE2x4 {
  ~FF2x4y15(); // tgen
  FF2x4y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x4y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x4y15 ::~FF2x4y15(){ note_dtor("_ZN3ccc8FF2x4y15E", this);} // tgen
ccc::FF2x4y15 ::FF2x4y15(){ note_ctor("_ZN3ccc8FF2x4y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x4y15E, buf);
    ::ccc::FF2x4y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x4y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y15E");
    check_base_class_offset(lv, (::ccc::EE2x4*), 0, "_ZN3ccc8FF2x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x4y15E);
    dp->::ccc::FF2x4y15::~FF2x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x4y15E(Test__ZN3ccc8FF2x4y15E, "_ZN3ccc8FF2x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x4y15C1Ev();
extern void _ZN3ccc8FF2x4y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x4y15E[] = {
  NSPAIR(_ZN3ccc8FF2x4y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x4E[];
static Base_Class bases__ZN3ccc8FF2x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x4y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv)();
extern void _ZN3ccc5EE2x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv)();
extern void _ZN3ccc5EE2x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv)();
extern void _ZN3ccc5EE2x43pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x4y15E[] = {
  {&(_ZTVN3ccc8FF2x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x4y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x4E__NS_8FF2x4y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x4y15E[];
static VTBL_ENTRY alt_thunk_names560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x43pqrEv,_ZTv0_n20_N3ccc5EE2x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x43abcEv,_ZTv0_n16_N3ccc5EE2x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x43efgEv,_ZTv0_n12_N3ccc5EE2x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x4y15E = {  "_ZN3ccc8FF2x4y15E", // class name
  bases__ZN3ccc8FF2x4y15E, 2,
  &(vtc__ZN3ccc8FF2x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x4y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x4y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x4y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x4y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names560,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y0  : virtual ::ccc::EE2x5 {
  virtual void  abc(); // _ZN3ccc7FF2x5y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y03pqrEv
  ~FF2x5y0(); // tgen
  FF2x5y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y03abcEv");}
void  ccc::FF2x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y03efgEv");}
void  ccc::FF2x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y03pqrEv");}
ccc::FF2x5y0 ::~FF2x5y0(){ note_dtor("_ZN3ccc7FF2x5y0E", this);} // tgen
ccc::FF2x5y0 ::FF2x5y0(){ note_ctor("_ZN3ccc7FF2x5y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y0E, buf);
    ::ccc::FF2x5y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y0E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y0E);
    dp->::ccc::FF2x5y0::~FF2x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y0E(Test__ZN3ccc7FF2x5y0E, "_ZN3ccc7FF2x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y0C1Ev();
extern void _ZN3ccc7FF2x5y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y0E[] = {
  NSPAIR(_ZN3ccc7FF2x5y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y0E[];
extern void _ZN3ccc7FF2x5y03efgEv();
extern void _ZN3ccc7FF2x5y03abcEv();
extern void _ZN3ccc7FF2x5y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y0E[] = {
  {&(_ZTVN3ccc7FF2x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y0E[];
static VTBL_ENTRY alt_thunk_names561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y0E = {  "_ZN3ccc7FF2x5y0E", // class name
  bases__ZN3ccc7FF2x5y0E, 2,
  &(vtc__ZN3ccc7FF2x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names561,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y1  : virtual ::ccc::EE2x5 {
  virtual void  abc(); // _ZN3ccc7FF2x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x5y13efgEv
  ~FF2x5y1(); // tgen
  FF2x5y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y13abcEv");}
void  ccc::FF2x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y13pqrEv");}
void  ccc::FF2x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y13efgEv");}
ccc::FF2x5y1 ::~FF2x5y1(){ note_dtor("_ZN3ccc7FF2x5y1E", this);} // tgen
ccc::FF2x5y1 ::FF2x5y1(){ note_ctor("_ZN3ccc7FF2x5y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y1E, buf);
    ::ccc::FF2x5y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y1E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y1E);
    dp->::ccc::FF2x5y1::~FF2x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y1E(Test__ZN3ccc7FF2x5y1E, "_ZN3ccc7FF2x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y1C1Ev();
extern void _ZN3ccc7FF2x5y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y1E[] = {
  NSPAIR(_ZN3ccc7FF2x5y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y1E[];
extern void _ZN3ccc7FF2x5y13efgEv();
extern void _ZN3ccc7FF2x5y13abcEv();
extern void _ZN3ccc7FF2x5y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y1E[] = {
  {&(_ZTVN3ccc7FF2x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y1E[];
static VTBL_ENTRY alt_thunk_names562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y1E = {  "_ZN3ccc7FF2x5y1E", // class name
  bases__ZN3ccc7FF2x5y1E, 2,
  &(vtc__ZN3ccc7FF2x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names562,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y2  : virtual ::ccc::EE2x5 {
  virtual void  efg(); // _ZN3ccc7FF2x5y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y23pqrEv
  ~FF2x5y2(); // tgen
  FF2x5y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y23efgEv");}
void  ccc::FF2x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y23abcEv");}
void  ccc::FF2x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y23pqrEv");}
ccc::FF2x5y2 ::~FF2x5y2(){ note_dtor("_ZN3ccc7FF2x5y2E", this);} // tgen
ccc::FF2x5y2 ::FF2x5y2(){ note_ctor("_ZN3ccc7FF2x5y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y2E, buf);
    ::ccc::FF2x5y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y2E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y2E);
    dp->::ccc::FF2x5y2::~FF2x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y2E(Test__ZN3ccc7FF2x5y2E, "_ZN3ccc7FF2x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y2C1Ev();
extern void _ZN3ccc7FF2x5y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y2E[] = {
  NSPAIR(_ZN3ccc7FF2x5y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y2E[];
extern void _ZN3ccc7FF2x5y23efgEv();
extern void _ZN3ccc7FF2x5y23abcEv();
extern void _ZN3ccc7FF2x5y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y2E[] = {
  {&(_ZTVN3ccc7FF2x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y2E[];
static VTBL_ENTRY alt_thunk_names563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y2E = {  "_ZN3ccc7FF2x5y2E", // class name
  bases__ZN3ccc7FF2x5y2E, 2,
  &(vtc__ZN3ccc7FF2x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names563,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y3  : virtual ::ccc::EE2x5 {
  virtual void  efg(); // _ZN3ccc7FF2x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x5y33abcEv
  ~FF2x5y3(); // tgen
  FF2x5y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y33efgEv");}
void  ccc::FF2x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y33pqrEv");}
void  ccc::FF2x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y33abcEv");}
ccc::FF2x5y3 ::~FF2x5y3(){ note_dtor("_ZN3ccc7FF2x5y3E", this);} // tgen
ccc::FF2x5y3 ::FF2x5y3(){ note_ctor("_ZN3ccc7FF2x5y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y3E, buf);
    ::ccc::FF2x5y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y3E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y3E);
    dp->::ccc::FF2x5y3::~FF2x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y3E(Test__ZN3ccc7FF2x5y3E, "_ZN3ccc7FF2x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y3C1Ev();
extern void _ZN3ccc7FF2x5y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y3E[] = {
  NSPAIR(_ZN3ccc7FF2x5y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y3E[];
extern void _ZN3ccc7FF2x5y33efgEv();
extern void _ZN3ccc7FF2x5y33abcEv();
extern void _ZN3ccc7FF2x5y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y3E[] = {
  {&(_ZTVN3ccc7FF2x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y3E[];
static VTBL_ENTRY alt_thunk_names564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y3E = {  "_ZN3ccc7FF2x5y3E", // class name
  bases__ZN3ccc7FF2x5y3E, 2,
  &(vtc__ZN3ccc7FF2x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names564,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y4  : virtual ::ccc::EE2x5 {
  virtual void  pqr(); // _ZN3ccc7FF2x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x5y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x5y43efgEv
  ~FF2x5y4(); // tgen
  FF2x5y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y43pqrEv");}
void  ccc::FF2x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y43abcEv");}
void  ccc::FF2x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y43efgEv");}
ccc::FF2x5y4 ::~FF2x5y4(){ note_dtor("_ZN3ccc7FF2x5y4E", this);} // tgen
ccc::FF2x5y4 ::FF2x5y4(){ note_ctor("_ZN3ccc7FF2x5y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y4E, buf);
    ::ccc::FF2x5y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y4E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y4E);
    dp->::ccc::FF2x5y4::~FF2x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y4E(Test__ZN3ccc7FF2x5y4E, "_ZN3ccc7FF2x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y4C1Ev();
extern void _ZN3ccc7FF2x5y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y4E[] = {
  NSPAIR(_ZN3ccc7FF2x5y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y4E[];
extern void _ZN3ccc7FF2x5y43efgEv();
extern void _ZN3ccc7FF2x5y43abcEv();
extern void _ZN3ccc7FF2x5y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y4E[] = {
  {&(_ZTVN3ccc7FF2x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y4E[];
static VTBL_ENTRY alt_thunk_names565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y4E = {  "_ZN3ccc7FF2x5y4E", // class name
  bases__ZN3ccc7FF2x5y4E, 2,
  &(vtc__ZN3ccc7FF2x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names565,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y5  : virtual ::ccc::EE2x5 {
  virtual void  pqr(); // _ZN3ccc7FF2x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x5y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x5y53abcEv
  ~FF2x5y5(); // tgen
  FF2x5y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y53pqrEv");}
void  ccc::FF2x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y53efgEv");}
void  ccc::FF2x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y53abcEv");}
ccc::FF2x5y5 ::~FF2x5y5(){ note_dtor("_ZN3ccc7FF2x5y5E", this);} // tgen
ccc::FF2x5y5 ::FF2x5y5(){ note_ctor("_ZN3ccc7FF2x5y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y5E, buf);
    ::ccc::FF2x5y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y5E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y5E);
    dp->::ccc::FF2x5y5::~FF2x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y5E(Test__ZN3ccc7FF2x5y5E, "_ZN3ccc7FF2x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y5C1Ev();
extern void _ZN3ccc7FF2x5y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y5E[] = {
  NSPAIR(_ZN3ccc7FF2x5y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y5E[];
extern void _ZN3ccc7FF2x5y53efgEv();
extern void _ZN3ccc7FF2x5y53abcEv();
extern void _ZN3ccc7FF2x5y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y5E[] = {
  {&(_ZTVN3ccc7FF2x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y5E[];
static VTBL_ENTRY alt_thunk_names566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y5E = {  "_ZN3ccc7FF2x5y5E", // class name
  bases__ZN3ccc7FF2x5y5E, 2,
  &(vtc__ZN3ccc7FF2x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names566,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y6  : virtual ::ccc::EE2x5 {
  virtual void  abc(); // _ZN3ccc7FF2x5y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x5y63efgEv
  ~FF2x5y6(); // tgen
  FF2x5y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y63abcEv");}
void  ccc::FF2x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y63efgEv");}
ccc::FF2x5y6 ::~FF2x5y6(){ note_dtor("_ZN3ccc7FF2x5y6E", this);} // tgen
ccc::FF2x5y6 ::FF2x5y6(){ note_ctor("_ZN3ccc7FF2x5y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y6E, buf);
    ::ccc::FF2x5y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y6E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y6E);
    dp->::ccc::FF2x5y6::~FF2x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y6E(Test__ZN3ccc7FF2x5y6E, "_ZN3ccc7FF2x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y6C1Ev();
extern void _ZN3ccc7FF2x5y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y6E[] = {
  NSPAIR(_ZN3ccc7FF2x5y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y6E[];
extern void _ZN3ccc7FF2x5y63efgEv();
extern void _ZN3ccc7FF2x5y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y6E[] = {
  {&(_ZTVN3ccc7FF2x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y6E[];
static VTBL_ENTRY alt_thunk_names567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y6E = {  "_ZN3ccc7FF2x5y6E", // class name
  bases__ZN3ccc7FF2x5y6E, 2,
  &(vtc__ZN3ccc7FF2x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names567,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y7  : virtual ::ccc::EE2x5 {
  virtual void  abc(); // _ZN3ccc7FF2x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y73pqrEv
  ~FF2x5y7(); // tgen
  FF2x5y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y73abcEv");}
void  ccc::FF2x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y73pqrEv");}
ccc::FF2x5y7 ::~FF2x5y7(){ note_dtor("_ZN3ccc7FF2x5y7E", this);} // tgen
ccc::FF2x5y7 ::FF2x5y7(){ note_ctor("_ZN3ccc7FF2x5y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y7E, buf);
    ::ccc::FF2x5y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y7E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y7E);
    dp->::ccc::FF2x5y7::~FF2x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y7E(Test__ZN3ccc7FF2x5y7E, "_ZN3ccc7FF2x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y7C1Ev();
extern void _ZN3ccc7FF2x5y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y7E[] = {
  NSPAIR(_ZN3ccc7FF2x5y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x5y73abcEv();
extern void _ZN3ccc7FF2x5y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y7E[] = {
  {&(_ZTVN3ccc7FF2x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y7E[];
static VTBL_ENTRY alt_thunk_names568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y7E = {  "_ZN3ccc7FF2x5y7E", // class name
  bases__ZN3ccc7FF2x5y7E, 2,
  &(vtc__ZN3ccc7FF2x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names568,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y8  : virtual ::ccc::EE2x5 {
  virtual void  efg(); // _ZN3ccc7FF2x5y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x5y83abcEv
  ~FF2x5y8(); // tgen
  FF2x5y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y83efgEv");}
void  ccc::FF2x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x5y83abcEv");}
ccc::FF2x5y8 ::~FF2x5y8(){ note_dtor("_ZN3ccc7FF2x5y8E", this);} // tgen
ccc::FF2x5y8 ::FF2x5y8(){ note_ctor("_ZN3ccc7FF2x5y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y8E, buf);
    ::ccc::FF2x5y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y8E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y8E);
    dp->::ccc::FF2x5y8::~FF2x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y8E(Test__ZN3ccc7FF2x5y8E, "_ZN3ccc7FF2x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y8C1Ev();
extern void _ZN3ccc7FF2x5y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y8E[] = {
  NSPAIR(_ZN3ccc7FF2x5y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y8E[];
extern void _ZN3ccc7FF2x5y83efgEv();
extern void _ZN3ccc7FF2x5y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y8E[] = {
  {&(_ZTVN3ccc7FF2x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y8E[];
static VTBL_ENTRY alt_thunk_names569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y8E = {  "_ZN3ccc7FF2x5y8E", // class name
  bases__ZN3ccc7FF2x5y8E, 2,
  &(vtc__ZN3ccc7FF2x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names569,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y9  : virtual ::ccc::EE2x5 {
  virtual void  efg(); // _ZN3ccc7FF2x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x5y93pqrEv
  ~FF2x5y9(); // tgen
  FF2x5y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x5y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x5y93efgEv");}
void  ccc::FF2x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x5y93pqrEv");}
ccc::FF2x5y9 ::~FF2x5y9(){ note_dtor("_ZN3ccc7FF2x5y9E", this);} // tgen
ccc::FF2x5y9 ::FF2x5y9(){ note_ctor("_ZN3ccc7FF2x5y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x5y9E, buf);
    ::ccc::FF2x5y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x5y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y9E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc7FF2x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x5y9E);
    dp->::ccc::FF2x5y9::~FF2x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x5y9E(Test__ZN3ccc7FF2x5y9E, "_ZN3ccc7FF2x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x5y9C1Ev();
extern void _ZN3ccc7FF2x5y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x5y9E[] = {
  NSPAIR(_ZN3ccc7FF2x5y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc7FF2x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y9E[];
extern void _ZN3ccc7FF2x5y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x5y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x5y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x5y9E[] = {
  {&(_ZTVN3ccc7FF2x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x5y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_7FF2x5y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x5y9E[];
static VTBL_ENTRY alt_thunk_names570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x5y9E = {  "_ZN3ccc7FF2x5y9E", // class name
  bases__ZN3ccc7FF2x5y9E, 2,
  &(vtc__ZN3ccc7FF2x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x5y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x5y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x5y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x5y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names570,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y10  : virtual ::ccc::EE2x5 {
  virtual void  pqr(); // _ZN3ccc8FF2x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x5y103abcEv
  ~FF2x5y10(); // tgen
  FF2x5y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x5y103pqrEv");}
void  ccc::FF2x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x5y103abcEv");}
ccc::FF2x5y10 ::~FF2x5y10(){ note_dtor("_ZN3ccc8FF2x5y10E", this);} // tgen
ccc::FF2x5y10 ::FF2x5y10(){ note_ctor("_ZN3ccc8FF2x5y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y10E, buf);
    ::ccc::FF2x5y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y10E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y10E);
    dp->::ccc::FF2x5y10::~FF2x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y10E(Test__ZN3ccc8FF2x5y10E, "_ZN3ccc8FF2x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y10C1Ev();
extern void _ZN3ccc8FF2x5y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y10E[] = {
  NSPAIR(_ZN3ccc8FF2x5y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x5y103abcEv();
extern void _ZN3ccc8FF2x5y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y10E[] = {
  {&(_ZTVN3ccc8FF2x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y10E[];
static VTBL_ENTRY alt_thunk_names571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y10E = {  "_ZN3ccc8FF2x5y10E", // class name
  bases__ZN3ccc8FF2x5y10E, 2,
  &(vtc__ZN3ccc8FF2x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names571,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y11  : virtual ::ccc::EE2x5 {
  virtual void  pqr(); // _ZN3ccc8FF2x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x5y113efgEv
  ~FF2x5y11(); // tgen
  FF2x5y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x5y113pqrEv");}
void  ccc::FF2x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x5y113efgEv");}
ccc::FF2x5y11 ::~FF2x5y11(){ note_dtor("_ZN3ccc8FF2x5y11E", this);} // tgen
ccc::FF2x5y11 ::FF2x5y11(){ note_ctor("_ZN3ccc8FF2x5y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y11E, buf);
    ::ccc::FF2x5y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y11E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y11E);
    dp->::ccc::FF2x5y11::~FF2x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y11E(Test__ZN3ccc8FF2x5y11E, "_ZN3ccc8FF2x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y11C1Ev();
extern void _ZN3ccc8FF2x5y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y11E[] = {
  NSPAIR(_ZN3ccc8FF2x5y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y11E[];
extern void _ZN3ccc8FF2x5y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x5y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y11E[] = {
  {&(_ZTVN3ccc8FF2x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y11E[];
static VTBL_ENTRY alt_thunk_names572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y11E = {  "_ZN3ccc8FF2x5y11E", // class name
  bases__ZN3ccc8FF2x5y11E, 2,
  &(vtc__ZN3ccc8FF2x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names572,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y12  : virtual ::ccc::EE2x5 {
  virtual void  abc(); // _ZN3ccc8FF2x5y123abcEv
  ~FF2x5y12(); // tgen
  FF2x5y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF2x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x5y123abcEv");}
ccc::FF2x5y12 ::~FF2x5y12(){ note_dtor("_ZN3ccc8FF2x5y12E", this);} // tgen
ccc::FF2x5y12 ::FF2x5y12(){ note_ctor("_ZN3ccc8FF2x5y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y12E, buf);
    ::ccc::FF2x5y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y12E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y12E);
    dp->::ccc::FF2x5y12::~FF2x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y12E(Test__ZN3ccc8FF2x5y12E, "_ZN3ccc8FF2x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y12C1Ev();
extern void _ZN3ccc8FF2x5y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y12E[] = {
  NSPAIR(_ZN3ccc8FF2x5y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x5y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y12E[] = {
  {&(_ZTVN3ccc8FF2x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y12E[];
static VTBL_ENTRY alt_thunk_names573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y12E = {  "_ZN3ccc8FF2x5y12E", // class name
  bases__ZN3ccc8FF2x5y12E, 2,
  &(vtc__ZN3ccc8FF2x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names573,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y13  : virtual ::ccc::EE2x5 {
  virtual void  efg(); // _ZN3ccc8FF2x5y133efgEv
  ~FF2x5y13(); // tgen
  FF2x5y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF2x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x5y133efgEv");}
ccc::FF2x5y13 ::~FF2x5y13(){ note_dtor("_ZN3ccc8FF2x5y13E", this);} // tgen
ccc::FF2x5y13 ::FF2x5y13(){ note_ctor("_ZN3ccc8FF2x5y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y13E, buf);
    ::ccc::FF2x5y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y13E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y13E);
    dp->::ccc::FF2x5y13::~FF2x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y13E(Test__ZN3ccc8FF2x5y13E, "_ZN3ccc8FF2x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y13C1Ev();
extern void _ZN3ccc8FF2x5y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y13E[] = {
  NSPAIR(_ZN3ccc8FF2x5y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y13E[];
extern void _ZN3ccc8FF2x5y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y13E[] = {
  {&(_ZTVN3ccc8FF2x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y13E[];
static VTBL_ENTRY alt_thunk_names574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y13E = {  "_ZN3ccc8FF2x5y13E", // class name
  bases__ZN3ccc8FF2x5y13E, 2,
  &(vtc__ZN3ccc8FF2x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names574,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y14  : virtual ::ccc::EE2x5 {
  virtual void  pqr(); // _ZN3ccc8FF2x5y143pqrEv
  ~FF2x5y14(); // tgen
  FF2x5y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x5y143pqrEv");}
ccc::FF2x5y14 ::~FF2x5y14(){ note_dtor("_ZN3ccc8FF2x5y14E", this);} // tgen
ccc::FF2x5y14 ::FF2x5y14(){ note_ctor("_ZN3ccc8FF2x5y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y14E, buf);
    ::ccc::FF2x5y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y14E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y14E);
    dp->::ccc::FF2x5y14::~FF2x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y14E(Test__ZN3ccc8FF2x5y14E, "_ZN3ccc8FF2x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y14C1Ev();
extern void _ZN3ccc8FF2x5y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y14E[] = {
  NSPAIR(_ZN3ccc8FF2x5y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x5y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x5y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y14E[] = {
  {&(_ZTVN3ccc8FF2x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y14E[];
static VTBL_ENTRY alt_thunk_names575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y14E = {  "_ZN3ccc8FF2x5y14E", // class name
  bases__ZN3ccc8FF2x5y14E, 2,
  &(vtc__ZN3ccc8FF2x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names575,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x5y15  : virtual ::ccc::EE2x5 {
  ~FF2x5y15(); // tgen
  FF2x5y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x5y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF2x5y15 ::~FF2x5y15(){ note_dtor("_ZN3ccc8FF2x5y15E", this);} // tgen
ccc::FF2x5y15 ::FF2x5y15(){ note_ctor("_ZN3ccc8FF2x5y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x5y15E, buf);
    ::ccc::FF2x5y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x5y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y15E");
    check_base_class_offset(lv, (::ccc::EE2x5*), 0, "_ZN3ccc8FF2x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x5y15E);
    dp->::ccc::FF2x5y15::~FF2x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x5y15E(Test__ZN3ccc8FF2x5y15E, "_ZN3ccc8FF2x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x5y15C1Ev();
extern void _ZN3ccc8FF2x5y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x5y15E[] = {
  NSPAIR(_ZN3ccc8FF2x5y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x5E[];
static Base_Class bases__ZN3ccc8FF2x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x5y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv)();
extern void _ZN3ccc5EE2x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv)();
extern void _ZN3ccc5EE2x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv)();
extern void _ZN3ccc5EE2x53pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x5y15E[] = {
  {&(_ZTVN3ccc8FF2x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x5y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x5E__NS_8FF2x5y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x5y15E[];
static VTBL_ENTRY alt_thunk_names576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x53pqrEv,_ZTv0_n20_N3ccc5EE2x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x53abcEv,_ZTv0_n16_N3ccc5EE2x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x53efgEv,_ZTv0_n12_N3ccc5EE2x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x5y15E = {  "_ZN3ccc8FF2x5y15E", // class name
  bases__ZN3ccc8FF2x5y15E, 2,
  &(vtc__ZN3ccc8FF2x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x5y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x5y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x5y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x5y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names576,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y0  : virtual ::ccc::EE2x6 {
  virtual void  abc(); // _ZN3ccc7FF2x6y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y03pqrEv
  ~FF2x6y0(); // tgen
  FF2x6y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y03abcEv");}
void  ccc::FF2x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y03efgEv");}
void  ccc::FF2x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y03pqrEv");}
ccc::FF2x6y0 ::~FF2x6y0(){ note_dtor("_ZN3ccc7FF2x6y0E", this);} // tgen
ccc::FF2x6y0 ::FF2x6y0(){ note_ctor("_ZN3ccc7FF2x6y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y0E, buf);
    ::ccc::FF2x6y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y0E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y0E);
    dp->::ccc::FF2x6y0::~FF2x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y0E(Test__ZN3ccc7FF2x6y0E, "_ZN3ccc7FF2x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y0C1Ev();
extern void _ZN3ccc7FF2x6y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y0E[] = {
  NSPAIR(_ZN3ccc7FF2x6y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y0E[];
extern void _ZN3ccc7FF2x6y03efgEv();
extern void _ZN3ccc7FF2x6y03abcEv();
extern void _ZN3ccc7FF2x6y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y0E[] = {
  {&(_ZTVN3ccc7FF2x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y0E[];
static VTBL_ENTRY alt_thunk_names577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y0E = {  "_ZN3ccc7FF2x6y0E", // class name
  bases__ZN3ccc7FF2x6y0E, 2,
  &(vtc__ZN3ccc7FF2x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names577,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y1  : virtual ::ccc::EE2x6 {
  virtual void  abc(); // _ZN3ccc7FF2x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x6y13efgEv
  ~FF2x6y1(); // tgen
  FF2x6y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y13abcEv");}
void  ccc::FF2x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y13pqrEv");}
void  ccc::FF2x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y13efgEv");}
ccc::FF2x6y1 ::~FF2x6y1(){ note_dtor("_ZN3ccc7FF2x6y1E", this);} // tgen
ccc::FF2x6y1 ::FF2x6y1(){ note_ctor("_ZN3ccc7FF2x6y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y1E, buf);
    ::ccc::FF2x6y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y1E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y1E);
    dp->::ccc::FF2x6y1::~FF2x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y1E(Test__ZN3ccc7FF2x6y1E, "_ZN3ccc7FF2x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y1C1Ev();
extern void _ZN3ccc7FF2x6y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y1E[] = {
  NSPAIR(_ZN3ccc7FF2x6y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y1E[];
extern void _ZN3ccc7FF2x6y13efgEv();
extern void _ZN3ccc7FF2x6y13abcEv();
extern void _ZN3ccc7FF2x6y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y1E[] = {
  {&(_ZTVN3ccc7FF2x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y1E[];
static VTBL_ENTRY alt_thunk_names578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y1E = {  "_ZN3ccc7FF2x6y1E", // class name
  bases__ZN3ccc7FF2x6y1E, 2,
  &(vtc__ZN3ccc7FF2x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names578,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y2  : virtual ::ccc::EE2x6 {
  virtual void  efg(); // _ZN3ccc7FF2x6y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y23pqrEv
  ~FF2x6y2(); // tgen
  FF2x6y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y23efgEv");}
void  ccc::FF2x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y23abcEv");}
void  ccc::FF2x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y23pqrEv");}
ccc::FF2x6y2 ::~FF2x6y2(){ note_dtor("_ZN3ccc7FF2x6y2E", this);} // tgen
ccc::FF2x6y2 ::FF2x6y2(){ note_ctor("_ZN3ccc7FF2x6y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y2E, buf);
    ::ccc::FF2x6y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y2E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y2E);
    dp->::ccc::FF2x6y2::~FF2x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y2E(Test__ZN3ccc7FF2x6y2E, "_ZN3ccc7FF2x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y2C1Ev();
extern void _ZN3ccc7FF2x6y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y2E[] = {
  NSPAIR(_ZN3ccc7FF2x6y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y2E[];
extern void _ZN3ccc7FF2x6y23efgEv();
extern void _ZN3ccc7FF2x6y23abcEv();
extern void _ZN3ccc7FF2x6y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y2E[] = {
  {&(_ZTVN3ccc7FF2x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y2E[];
static VTBL_ENTRY alt_thunk_names579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y2E = {  "_ZN3ccc7FF2x6y2E", // class name
  bases__ZN3ccc7FF2x6y2E, 2,
  &(vtc__ZN3ccc7FF2x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names579,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y3  : virtual ::ccc::EE2x6 {
  virtual void  efg(); // _ZN3ccc7FF2x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x6y33abcEv
  ~FF2x6y3(); // tgen
  FF2x6y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y33efgEv");}
void  ccc::FF2x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y33pqrEv");}
void  ccc::FF2x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y33abcEv");}
ccc::FF2x6y3 ::~FF2x6y3(){ note_dtor("_ZN3ccc7FF2x6y3E", this);} // tgen
ccc::FF2x6y3 ::FF2x6y3(){ note_ctor("_ZN3ccc7FF2x6y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y3E, buf);
    ::ccc::FF2x6y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y3E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y3E);
    dp->::ccc::FF2x6y3::~FF2x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y3E(Test__ZN3ccc7FF2x6y3E, "_ZN3ccc7FF2x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y3C1Ev();
extern void _ZN3ccc7FF2x6y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y3E[] = {
  NSPAIR(_ZN3ccc7FF2x6y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y3E[];
extern void _ZN3ccc7FF2x6y33efgEv();
extern void _ZN3ccc7FF2x6y33abcEv();
extern void _ZN3ccc7FF2x6y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y3E[] = {
  {&(_ZTVN3ccc7FF2x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y3E[];
static VTBL_ENTRY alt_thunk_names580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y3E = {  "_ZN3ccc7FF2x6y3E", // class name
  bases__ZN3ccc7FF2x6y3E, 2,
  &(vtc__ZN3ccc7FF2x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names580,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y4  : virtual ::ccc::EE2x6 {
  virtual void  pqr(); // _ZN3ccc7FF2x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x6y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x6y43efgEv
  ~FF2x6y4(); // tgen
  FF2x6y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y43pqrEv");}
void  ccc::FF2x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y43abcEv");}
void  ccc::FF2x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y43efgEv");}
ccc::FF2x6y4 ::~FF2x6y4(){ note_dtor("_ZN3ccc7FF2x6y4E", this);} // tgen
ccc::FF2x6y4 ::FF2x6y4(){ note_ctor("_ZN3ccc7FF2x6y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y4E, buf);
    ::ccc::FF2x6y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y4E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y4E);
    dp->::ccc::FF2x6y4::~FF2x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y4E(Test__ZN3ccc7FF2x6y4E, "_ZN3ccc7FF2x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y4C1Ev();
extern void _ZN3ccc7FF2x6y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y4E[] = {
  NSPAIR(_ZN3ccc7FF2x6y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y4E[];
extern void _ZN3ccc7FF2x6y43efgEv();
extern void _ZN3ccc7FF2x6y43abcEv();
extern void _ZN3ccc7FF2x6y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y4E[] = {
  {&(_ZTVN3ccc7FF2x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y4E[];
static VTBL_ENTRY alt_thunk_names581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y4E = {  "_ZN3ccc7FF2x6y4E", // class name
  bases__ZN3ccc7FF2x6y4E, 2,
  &(vtc__ZN3ccc7FF2x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names581,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y5  : virtual ::ccc::EE2x6 {
  virtual void  pqr(); // _ZN3ccc7FF2x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x6y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x6y53abcEv
  ~FF2x6y5(); // tgen
  FF2x6y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y53pqrEv");}
void  ccc::FF2x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y53efgEv");}
void  ccc::FF2x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y53abcEv");}
ccc::FF2x6y5 ::~FF2x6y5(){ note_dtor("_ZN3ccc7FF2x6y5E", this);} // tgen
ccc::FF2x6y5 ::FF2x6y5(){ note_ctor("_ZN3ccc7FF2x6y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y5E, buf);
    ::ccc::FF2x6y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y5E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y5E);
    dp->::ccc::FF2x6y5::~FF2x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y5E(Test__ZN3ccc7FF2x6y5E, "_ZN3ccc7FF2x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y5C1Ev();
extern void _ZN3ccc7FF2x6y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y5E[] = {
  NSPAIR(_ZN3ccc7FF2x6y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y5E[];
extern void _ZN3ccc7FF2x6y53efgEv();
extern void _ZN3ccc7FF2x6y53abcEv();
extern void _ZN3ccc7FF2x6y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y5E[] = {
  {&(_ZTVN3ccc7FF2x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y5E[];
static VTBL_ENTRY alt_thunk_names582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y5E = {  "_ZN3ccc7FF2x6y5E", // class name
  bases__ZN3ccc7FF2x6y5E, 2,
  &(vtc__ZN3ccc7FF2x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names582,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y6  : virtual ::ccc::EE2x6 {
  virtual void  abc(); // _ZN3ccc7FF2x6y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x6y63efgEv
  ~FF2x6y6(); // tgen
  FF2x6y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y63abcEv");}
void  ccc::FF2x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y63efgEv");}
ccc::FF2x6y6 ::~FF2x6y6(){ note_dtor("_ZN3ccc7FF2x6y6E", this);} // tgen
ccc::FF2x6y6 ::FF2x6y6(){ note_ctor("_ZN3ccc7FF2x6y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y6E, buf);
    ::ccc::FF2x6y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y6E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y6E);
    dp->::ccc::FF2x6y6::~FF2x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y6E(Test__ZN3ccc7FF2x6y6E, "_ZN3ccc7FF2x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y6C1Ev();
extern void _ZN3ccc7FF2x6y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y6E[] = {
  NSPAIR(_ZN3ccc7FF2x6y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y6E[];
extern void _ZN3ccc7FF2x6y63efgEv();
extern void _ZN3ccc7FF2x6y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y6E[] = {
  {&(_ZTVN3ccc7FF2x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y6E[];
static VTBL_ENTRY alt_thunk_names583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y6E = {  "_ZN3ccc7FF2x6y6E", // class name
  bases__ZN3ccc7FF2x6y6E, 2,
  &(vtc__ZN3ccc7FF2x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names583,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y7  : virtual ::ccc::EE2x6 {
  virtual void  abc(); // _ZN3ccc7FF2x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y73pqrEv
  ~FF2x6y7(); // tgen
  FF2x6y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y73abcEv");}
void  ccc::FF2x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y73pqrEv");}
ccc::FF2x6y7 ::~FF2x6y7(){ note_dtor("_ZN3ccc7FF2x6y7E", this);} // tgen
ccc::FF2x6y7 ::FF2x6y7(){ note_ctor("_ZN3ccc7FF2x6y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y7E, buf);
    ::ccc::FF2x6y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y7E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y7E);
    dp->::ccc::FF2x6y7::~FF2x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y7E(Test__ZN3ccc7FF2x6y7E, "_ZN3ccc7FF2x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y7C1Ev();
extern void _ZN3ccc7FF2x6y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y7E[] = {
  NSPAIR(_ZN3ccc7FF2x6y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x6y73abcEv();
extern void _ZN3ccc7FF2x6y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y7E[] = {
  {&(_ZTVN3ccc7FF2x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y7E[];
static VTBL_ENTRY alt_thunk_names584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y7E = {  "_ZN3ccc7FF2x6y7E", // class name
  bases__ZN3ccc7FF2x6y7E, 2,
  &(vtc__ZN3ccc7FF2x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names584,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y8  : virtual ::ccc::EE2x6 {
  virtual void  efg(); // _ZN3ccc7FF2x6y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x6y83abcEv
  ~FF2x6y8(); // tgen
  FF2x6y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y83efgEv");}
void  ccc::FF2x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x6y83abcEv");}
ccc::FF2x6y8 ::~FF2x6y8(){ note_dtor("_ZN3ccc7FF2x6y8E", this);} // tgen
ccc::FF2x6y8 ::FF2x6y8(){ note_ctor("_ZN3ccc7FF2x6y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y8E, buf);
    ::ccc::FF2x6y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y8E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y8E);
    dp->::ccc::FF2x6y8::~FF2x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y8E(Test__ZN3ccc7FF2x6y8E, "_ZN3ccc7FF2x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y8C1Ev();
extern void _ZN3ccc7FF2x6y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y8E[] = {
  NSPAIR(_ZN3ccc7FF2x6y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y8E[];
extern void _ZN3ccc7FF2x6y83efgEv();
extern void _ZN3ccc7FF2x6y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y8E[] = {
  {&(_ZTVN3ccc7FF2x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y8E[];
static VTBL_ENTRY alt_thunk_names585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y8E = {  "_ZN3ccc7FF2x6y8E", // class name
  bases__ZN3ccc7FF2x6y8E, 2,
  &(vtc__ZN3ccc7FF2x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names585,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y9  : virtual ::ccc::EE2x6 {
  virtual void  efg(); // _ZN3ccc7FF2x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x6y93pqrEv
  ~FF2x6y9(); // tgen
  FF2x6y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x6y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x6y93efgEv");}
void  ccc::FF2x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x6y93pqrEv");}
ccc::FF2x6y9 ::~FF2x6y9(){ note_dtor("_ZN3ccc7FF2x6y9E", this);} // tgen
ccc::FF2x6y9 ::FF2x6y9(){ note_ctor("_ZN3ccc7FF2x6y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x6y9E, buf);
    ::ccc::FF2x6y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x6y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y9E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc7FF2x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x6y9E);
    dp->::ccc::FF2x6y9::~FF2x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x6y9E(Test__ZN3ccc7FF2x6y9E, "_ZN3ccc7FF2x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x6y9C1Ev();
extern void _ZN3ccc7FF2x6y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x6y9E[] = {
  NSPAIR(_ZN3ccc7FF2x6y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc7FF2x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y9E[];
extern void _ZN3ccc7FF2x6y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x6y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x6y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x6y9E[] = {
  {&(_ZTVN3ccc7FF2x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x6y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_7FF2x6y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x6y9E[];
static VTBL_ENTRY alt_thunk_names586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x6y9E = {  "_ZN3ccc7FF2x6y9E", // class name
  bases__ZN3ccc7FF2x6y9E, 2,
  &(vtc__ZN3ccc7FF2x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x6y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x6y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x6y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x6y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names586,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y10  : virtual ::ccc::EE2x6 {
  virtual void  pqr(); // _ZN3ccc8FF2x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x6y103abcEv
  ~FF2x6y10(); // tgen
  FF2x6y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x6y103pqrEv");}
void  ccc::FF2x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x6y103abcEv");}
ccc::FF2x6y10 ::~FF2x6y10(){ note_dtor("_ZN3ccc8FF2x6y10E", this);} // tgen
ccc::FF2x6y10 ::FF2x6y10(){ note_ctor("_ZN3ccc8FF2x6y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y10E, buf);
    ::ccc::FF2x6y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y10E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y10E);
    dp->::ccc::FF2x6y10::~FF2x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y10E(Test__ZN3ccc8FF2x6y10E, "_ZN3ccc8FF2x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y10C1Ev();
extern void _ZN3ccc8FF2x6y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y10E[] = {
  NSPAIR(_ZN3ccc8FF2x6y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x6y103abcEv();
extern void _ZN3ccc8FF2x6y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y10E[] = {
  {&(_ZTVN3ccc8FF2x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y10E[];
static VTBL_ENTRY alt_thunk_names587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y10E = {  "_ZN3ccc8FF2x6y10E", // class name
  bases__ZN3ccc8FF2x6y10E, 2,
  &(vtc__ZN3ccc8FF2x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names587,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y11  : virtual ::ccc::EE2x6 {
  virtual void  pqr(); // _ZN3ccc8FF2x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x6y113efgEv
  ~FF2x6y11(); // tgen
  FF2x6y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x6y113pqrEv");}
void  ccc::FF2x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x6y113efgEv");}
ccc::FF2x6y11 ::~FF2x6y11(){ note_dtor("_ZN3ccc8FF2x6y11E", this);} // tgen
ccc::FF2x6y11 ::FF2x6y11(){ note_ctor("_ZN3ccc8FF2x6y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y11E, buf);
    ::ccc::FF2x6y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y11E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y11E);
    dp->::ccc::FF2x6y11::~FF2x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y11E(Test__ZN3ccc8FF2x6y11E, "_ZN3ccc8FF2x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y11C1Ev();
extern void _ZN3ccc8FF2x6y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y11E[] = {
  NSPAIR(_ZN3ccc8FF2x6y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y11E[];
extern void _ZN3ccc8FF2x6y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x6y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y11E[] = {
  {&(_ZTVN3ccc8FF2x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y11E[];
static VTBL_ENTRY alt_thunk_names588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y11E = {  "_ZN3ccc8FF2x6y11E", // class name
  bases__ZN3ccc8FF2x6y11E, 2,
  &(vtc__ZN3ccc8FF2x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names588,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y12  : virtual ::ccc::EE2x6 {
  virtual void  abc(); // _ZN3ccc8FF2x6y123abcEv
  ~FF2x6y12(); // tgen
  FF2x6y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x6y123abcEv");}
ccc::FF2x6y12 ::~FF2x6y12(){ note_dtor("_ZN3ccc8FF2x6y12E", this);} // tgen
ccc::FF2x6y12 ::FF2x6y12(){ note_ctor("_ZN3ccc8FF2x6y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y12E, buf);
    ::ccc::FF2x6y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y12E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y12E);
    dp->::ccc::FF2x6y12::~FF2x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y12E(Test__ZN3ccc8FF2x6y12E, "_ZN3ccc8FF2x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y12C1Ev();
extern void _ZN3ccc8FF2x6y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y12E[] = {
  NSPAIR(_ZN3ccc8FF2x6y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x6y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y12E[] = {
  {&(_ZTVN3ccc8FF2x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y12E[];
static VTBL_ENTRY alt_thunk_names589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y12E = {  "_ZN3ccc8FF2x6y12E", // class name
  bases__ZN3ccc8FF2x6y12E, 2,
  &(vtc__ZN3ccc8FF2x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names589,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y13  : virtual ::ccc::EE2x6 {
  virtual void  efg(); // _ZN3ccc8FF2x6y133efgEv
  ~FF2x6y13(); // tgen
  FF2x6y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x6y133efgEv");}
ccc::FF2x6y13 ::~FF2x6y13(){ note_dtor("_ZN3ccc8FF2x6y13E", this);} // tgen
ccc::FF2x6y13 ::FF2x6y13(){ note_ctor("_ZN3ccc8FF2x6y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y13E, buf);
    ::ccc::FF2x6y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y13E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y13E);
    dp->::ccc::FF2x6y13::~FF2x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y13E(Test__ZN3ccc8FF2x6y13E, "_ZN3ccc8FF2x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y13C1Ev();
extern void _ZN3ccc8FF2x6y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y13E[] = {
  NSPAIR(_ZN3ccc8FF2x6y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y13E[];
extern void _ZN3ccc8FF2x6y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y13E[] = {
  {&(_ZTVN3ccc8FF2x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y13E[];
static VTBL_ENTRY alt_thunk_names590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y13E = {  "_ZN3ccc8FF2x6y13E", // class name
  bases__ZN3ccc8FF2x6y13E, 2,
  &(vtc__ZN3ccc8FF2x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names590,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y14  : virtual ::ccc::EE2x6 {
  virtual void  pqr(); // _ZN3ccc8FF2x6y143pqrEv
  ~FF2x6y14(); // tgen
  FF2x6y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x6y143pqrEv");}
ccc::FF2x6y14 ::~FF2x6y14(){ note_dtor("_ZN3ccc8FF2x6y14E", this);} // tgen
ccc::FF2x6y14 ::FF2x6y14(){ note_ctor("_ZN3ccc8FF2x6y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y14E, buf);
    ::ccc::FF2x6y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y14E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y14E);
    dp->::ccc::FF2x6y14::~FF2x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y14E(Test__ZN3ccc8FF2x6y14E, "_ZN3ccc8FF2x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y14C1Ev();
extern void _ZN3ccc8FF2x6y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y14E[] = {
  NSPAIR(_ZN3ccc8FF2x6y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x6y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x6y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y14E[] = {
  {&(_ZTVN3ccc8FF2x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y14E[];
static VTBL_ENTRY alt_thunk_names591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y14E = {  "_ZN3ccc8FF2x6y14E", // class name
  bases__ZN3ccc8FF2x6y14E, 2,
  &(vtc__ZN3ccc8FF2x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names591,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x6y15  : virtual ::ccc::EE2x6 {
  ~FF2x6y15(); // tgen
  FF2x6y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x6y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2}}
}
namespace ccc { 
ccc::FF2x6y15 ::~FF2x6y15(){ note_dtor("_ZN3ccc8FF2x6y15E", this);} // tgen
ccc::FF2x6y15 ::FF2x6y15(){ note_ctor("_ZN3ccc8FF2x6y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x6y15E, buf);
    ::ccc::FF2x6y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x6y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y15E");
    check_base_class_offset(lv, (::ccc::EE2x6*), 0, "_ZN3ccc8FF2x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x6y15E);
    dp->::ccc::FF2x6y15::~FF2x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x6y15E(Test__ZN3ccc8FF2x6y15E, "_ZN3ccc8FF2x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x6y15C1Ev();
extern void _ZN3ccc8FF2x6y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x6y15E[] = {
  NSPAIR(_ZN3ccc8FF2x6y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x6E[];
static Base_Class bases__ZN3ccc8FF2x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x6y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv)();
extern void _ZN3ccc5EE2x63efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv)();
extern void _ZN3ccc5EE2x63abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x6y15E[] = {
  {&(_ZTVN3ccc8FF2x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x6y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x6E__NS_8FF2x6y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x6y15E[];
static VTBL_ENTRY alt_thunk_names592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x63abcEv,_ZTv0_n16_N3ccc5EE2x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x63efgEv,_ZTv0_n12_N3ccc5EE2x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x6y15E = {  "_ZN3ccc8FF2x6y15E", // class name
  bases__ZN3ccc8FF2x6y15E, 2,
  &(vtc__ZN3ccc8FF2x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x6y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x6y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x6y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x6y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names592,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y0  : virtual ::ccc::EE2x7 {
  virtual void  abc(); // _ZN3ccc7FF2x7y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y03pqrEv
  ~FF2x7y0(); // tgen
  FF2x7y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y03abcEv");}
void  ccc::FF2x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y03efgEv");}
void  ccc::FF2x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y03pqrEv");}
ccc::FF2x7y0 ::~FF2x7y0(){ note_dtor("_ZN3ccc7FF2x7y0E", this);} // tgen
ccc::FF2x7y0 ::FF2x7y0(){ note_ctor("_ZN3ccc7FF2x7y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y0E, buf);
    ::ccc::FF2x7y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y0E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y0E);
    dp->::ccc::FF2x7y0::~FF2x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y0E(Test__ZN3ccc7FF2x7y0E, "_ZN3ccc7FF2x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y0C1Ev();
extern void _ZN3ccc7FF2x7y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y0E[] = {
  NSPAIR(_ZN3ccc7FF2x7y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y0E[];
extern void _ZN3ccc7FF2x7y03efgEv();
extern void _ZN3ccc7FF2x7y03abcEv();
extern void _ZN3ccc7FF2x7y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y0E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y0E[] = {
  {&(_ZTVN3ccc7FF2x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y0E[];
static VTBL_ENTRY alt_thunk_names593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y0E = {  "_ZN3ccc7FF2x7y0E", // class name
  bases__ZN3ccc7FF2x7y0E, 2,
  &(vtc__ZN3ccc7FF2x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names593,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y1  : virtual ::ccc::EE2x7 {
  virtual void  abc(); // _ZN3ccc7FF2x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x7y13efgEv
  ~FF2x7y1(); // tgen
  FF2x7y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y13abcEv");}
void  ccc::FF2x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y13pqrEv");}
void  ccc::FF2x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y13efgEv");}
ccc::FF2x7y1 ::~FF2x7y1(){ note_dtor("_ZN3ccc7FF2x7y1E", this);} // tgen
ccc::FF2x7y1 ::FF2x7y1(){ note_ctor("_ZN3ccc7FF2x7y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y1E, buf);
    ::ccc::FF2x7y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y1E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y1E);
    dp->::ccc::FF2x7y1::~FF2x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y1E(Test__ZN3ccc7FF2x7y1E, "_ZN3ccc7FF2x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y1C1Ev();
extern void _ZN3ccc7FF2x7y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y1E[] = {
  NSPAIR(_ZN3ccc7FF2x7y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y1E[];
extern void _ZN3ccc7FF2x7y13efgEv();
extern void _ZN3ccc7FF2x7y13abcEv();
extern void _ZN3ccc7FF2x7y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y1E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y1E[] = {
  {&(_ZTVN3ccc7FF2x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y1E[];
static VTBL_ENTRY alt_thunk_names594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y1E = {  "_ZN3ccc7FF2x7y1E", // class name
  bases__ZN3ccc7FF2x7y1E, 2,
  &(vtc__ZN3ccc7FF2x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names594,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y2  : virtual ::ccc::EE2x7 {
  virtual void  efg(); // _ZN3ccc7FF2x7y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y23pqrEv
  ~FF2x7y2(); // tgen
  FF2x7y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y23efgEv");}
void  ccc::FF2x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y23abcEv");}
void  ccc::FF2x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y23pqrEv");}
ccc::FF2x7y2 ::~FF2x7y2(){ note_dtor("_ZN3ccc7FF2x7y2E", this);} // tgen
ccc::FF2x7y2 ::FF2x7y2(){ note_ctor("_ZN3ccc7FF2x7y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y2E, buf);
    ::ccc::FF2x7y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y2E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y2E);
    dp->::ccc::FF2x7y2::~FF2x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y2E(Test__ZN3ccc7FF2x7y2E, "_ZN3ccc7FF2x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y2C1Ev();
extern void _ZN3ccc7FF2x7y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y2E[] = {
  NSPAIR(_ZN3ccc7FF2x7y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y2E[];
extern void _ZN3ccc7FF2x7y23efgEv();
extern void _ZN3ccc7FF2x7y23abcEv();
extern void _ZN3ccc7FF2x7y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y2E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y2E[] = {
  {&(_ZTVN3ccc7FF2x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y2E[];
static VTBL_ENTRY alt_thunk_names595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y2E = {  "_ZN3ccc7FF2x7y2E", // class name
  bases__ZN3ccc7FF2x7y2E, 2,
  &(vtc__ZN3ccc7FF2x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names595,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y3  : virtual ::ccc::EE2x7 {
  virtual void  efg(); // _ZN3ccc7FF2x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x7y33abcEv
  ~FF2x7y3(); // tgen
  FF2x7y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y33efgEv");}
void  ccc::FF2x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y33pqrEv");}
void  ccc::FF2x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y33abcEv");}
ccc::FF2x7y3 ::~FF2x7y3(){ note_dtor("_ZN3ccc7FF2x7y3E", this);} // tgen
ccc::FF2x7y3 ::FF2x7y3(){ note_ctor("_ZN3ccc7FF2x7y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y3E, buf);
    ::ccc::FF2x7y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y3E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y3E);
    dp->::ccc::FF2x7y3::~FF2x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y3E(Test__ZN3ccc7FF2x7y3E, "_ZN3ccc7FF2x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y3C1Ev();
extern void _ZN3ccc7FF2x7y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y3E[] = {
  NSPAIR(_ZN3ccc7FF2x7y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y3E[];
extern void _ZN3ccc7FF2x7y33efgEv();
extern void _ZN3ccc7FF2x7y33abcEv();
extern void _ZN3ccc7FF2x7y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y3E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y3E[] = {
  {&(_ZTVN3ccc7FF2x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y3E[];
static VTBL_ENTRY alt_thunk_names596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y3E = {  "_ZN3ccc7FF2x7y3E", // class name
  bases__ZN3ccc7FF2x7y3E, 2,
  &(vtc__ZN3ccc7FF2x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names596,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y4  : virtual ::ccc::EE2x7 {
  virtual void  pqr(); // _ZN3ccc7FF2x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x7y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x7y43efgEv
  ~FF2x7y4(); // tgen
  FF2x7y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y43pqrEv");}
void  ccc::FF2x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y43abcEv");}
void  ccc::FF2x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y43efgEv");}
ccc::FF2x7y4 ::~FF2x7y4(){ note_dtor("_ZN3ccc7FF2x7y4E", this);} // tgen
ccc::FF2x7y4 ::FF2x7y4(){ note_ctor("_ZN3ccc7FF2x7y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y4E, buf);
    ::ccc::FF2x7y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y4E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y4E);
    dp->::ccc::FF2x7y4::~FF2x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y4E(Test__ZN3ccc7FF2x7y4E, "_ZN3ccc7FF2x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y4C1Ev();
extern void _ZN3ccc7FF2x7y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y4E[] = {
  NSPAIR(_ZN3ccc7FF2x7y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y4E[];
extern void _ZN3ccc7FF2x7y43efgEv();
extern void _ZN3ccc7FF2x7y43abcEv();
extern void _ZN3ccc7FF2x7y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y4E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y4E[] = {
  {&(_ZTVN3ccc7FF2x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y4E[];
static VTBL_ENTRY alt_thunk_names597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y4E = {  "_ZN3ccc7FF2x7y4E", // class name
  bases__ZN3ccc7FF2x7y4E, 2,
  &(vtc__ZN3ccc7FF2x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names597,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y5  : virtual ::ccc::EE2x7 {
  virtual void  pqr(); // _ZN3ccc7FF2x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x7y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x7y53abcEv
  ~FF2x7y5(); // tgen
  FF2x7y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y53pqrEv");}
void  ccc::FF2x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y53efgEv");}
void  ccc::FF2x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y53abcEv");}
ccc::FF2x7y5 ::~FF2x7y5(){ note_dtor("_ZN3ccc7FF2x7y5E", this);} // tgen
ccc::FF2x7y5 ::FF2x7y5(){ note_ctor("_ZN3ccc7FF2x7y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y5E, buf);
    ::ccc::FF2x7y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y5E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y5E);
    dp->::ccc::FF2x7y5::~FF2x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y5E(Test__ZN3ccc7FF2x7y5E, "_ZN3ccc7FF2x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y5C1Ev();
extern void _ZN3ccc7FF2x7y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y5E[] = {
  NSPAIR(_ZN3ccc7FF2x7y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y5E[];
extern void _ZN3ccc7FF2x7y53efgEv();
extern void _ZN3ccc7FF2x7y53abcEv();
extern void _ZN3ccc7FF2x7y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y5E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y5E[] = {
  {&(_ZTVN3ccc7FF2x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y5E[];
static VTBL_ENTRY alt_thunk_names598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y5E = {  "_ZN3ccc7FF2x7y5E", // class name
  bases__ZN3ccc7FF2x7y5E, 2,
  &(vtc__ZN3ccc7FF2x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names598,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y6  : virtual ::ccc::EE2x7 {
  virtual void  abc(); // _ZN3ccc7FF2x7y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x7y63efgEv
  ~FF2x7y6(); // tgen
  FF2x7y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y63abcEv");}
void  ccc::FF2x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y63efgEv");}
ccc::FF2x7y6 ::~FF2x7y6(){ note_dtor("_ZN3ccc7FF2x7y6E", this);} // tgen
ccc::FF2x7y6 ::FF2x7y6(){ note_ctor("_ZN3ccc7FF2x7y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y6E, buf);
    ::ccc::FF2x7y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y6E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y6E);
    dp->::ccc::FF2x7y6::~FF2x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y6E(Test__ZN3ccc7FF2x7y6E, "_ZN3ccc7FF2x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y6C1Ev();
extern void _ZN3ccc7FF2x7y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y6E[] = {
  NSPAIR(_ZN3ccc7FF2x7y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y6E[];
extern void _ZN3ccc7FF2x7y63efgEv();
extern void _ZN3ccc7FF2x7y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y6E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y6E[] = {
  {&(_ZTVN3ccc7FF2x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y6E[];
static VTBL_ENTRY alt_thunk_names599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y6E = {  "_ZN3ccc7FF2x7y6E", // class name
  bases__ZN3ccc7FF2x7y6E, 2,
  &(vtc__ZN3ccc7FF2x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names599,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y7  : virtual ::ccc::EE2x7 {
  virtual void  abc(); // _ZN3ccc7FF2x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y73pqrEv
  ~FF2x7y7(); // tgen
  FF2x7y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y73abcEv");}
void  ccc::FF2x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y73pqrEv");}
ccc::FF2x7y7 ::~FF2x7y7(){ note_dtor("_ZN3ccc7FF2x7y7E", this);} // tgen
ccc::FF2x7y7 ::FF2x7y7(){ note_ctor("_ZN3ccc7FF2x7y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y7E, buf);
    ::ccc::FF2x7y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y7E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y7E);
    dp->::ccc::FF2x7y7::~FF2x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y7E(Test__ZN3ccc7FF2x7y7E, "_ZN3ccc7FF2x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y7C1Ev();
extern void _ZN3ccc7FF2x7y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y7E[] = {
  NSPAIR(_ZN3ccc7FF2x7y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7FF2x7y73abcEv();
extern void _ZN3ccc7FF2x7y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y7E[] = {
  {&(_ZTVN3ccc7FF2x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y7E[];
static VTBL_ENTRY alt_thunk_names600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y7E = {  "_ZN3ccc7FF2x7y7E", // class name
  bases__ZN3ccc7FF2x7y7E, 2,
  &(vtc__ZN3ccc7FF2x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names600,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y8  : virtual ::ccc::EE2x7 {
  virtual void  efg(); // _ZN3ccc7FF2x7y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x7y83abcEv
  ~FF2x7y8(); // tgen
  FF2x7y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y83efgEv");}
void  ccc::FF2x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x7y83abcEv");}
ccc::FF2x7y8 ::~FF2x7y8(){ note_dtor("_ZN3ccc7FF2x7y8E", this);} // tgen
ccc::FF2x7y8 ::FF2x7y8(){ note_ctor("_ZN3ccc7FF2x7y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y8E, buf);
    ::ccc::FF2x7y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y8E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y8E);
    dp->::ccc::FF2x7y8::~FF2x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y8E(Test__ZN3ccc7FF2x7y8E, "_ZN3ccc7FF2x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y8C1Ev();
extern void _ZN3ccc7FF2x7y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y8E[] = {
  NSPAIR(_ZN3ccc7FF2x7y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y8E[];
extern void _ZN3ccc7FF2x7y83efgEv();
extern void _ZN3ccc7FF2x7y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y8E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y8E[] = {
  {&(_ZTVN3ccc7FF2x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y8E[];
static VTBL_ENTRY alt_thunk_names601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y8E = {  "_ZN3ccc7FF2x7y8E", // class name
  bases__ZN3ccc7FF2x7y8E, 2,
  &(vtc__ZN3ccc7FF2x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names601,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y9  : virtual ::ccc::EE2x7 {
  virtual void  efg(); // _ZN3ccc7FF2x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x7y93pqrEv
  ~FF2x7y9(); // tgen
  FF2x7y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x7y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x7y93efgEv");}
void  ccc::FF2x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x7y93pqrEv");}
ccc::FF2x7y9 ::~FF2x7y9(){ note_dtor("_ZN3ccc7FF2x7y9E", this);} // tgen
ccc::FF2x7y9 ::FF2x7y9(){ note_ctor("_ZN3ccc7FF2x7y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x7y9E, buf);
    ::ccc::FF2x7y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x7y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y9E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc7FF2x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x7y9E);
    dp->::ccc::FF2x7y9::~FF2x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x7y9E(Test__ZN3ccc7FF2x7y9E, "_ZN3ccc7FF2x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x7y9C1Ev();
extern void _ZN3ccc7FF2x7y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x7y9E[] = {
  NSPAIR(_ZN3ccc7FF2x7y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc7FF2x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y9E[];
extern void _ZN3ccc7FF2x7y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x7y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x7y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x7y9E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x7y9E[] = {
  {&(_ZTVN3ccc7FF2x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x7y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_7FF2x7y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x7y9E[];
static VTBL_ENTRY alt_thunk_names602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x7y9E = {  "_ZN3ccc7FF2x7y9E", // class name
  bases__ZN3ccc7FF2x7y9E, 2,
  &(vtc__ZN3ccc7FF2x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x7y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x7y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x7y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x7y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names602,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y10  : virtual ::ccc::EE2x7 {
  virtual void  pqr(); // _ZN3ccc8FF2x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x7y103abcEv
  ~FF2x7y10(); // tgen
  FF2x7y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x7y103pqrEv");}
void  ccc::FF2x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x7y103abcEv");}
ccc::FF2x7y10 ::~FF2x7y10(){ note_dtor("_ZN3ccc8FF2x7y10E", this);} // tgen
ccc::FF2x7y10 ::FF2x7y10(){ note_ctor("_ZN3ccc8FF2x7y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y10E, buf);
    ::ccc::FF2x7y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y10E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y10E);
    dp->::ccc::FF2x7y10::~FF2x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y10E(Test__ZN3ccc8FF2x7y10E, "_ZN3ccc8FF2x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y10C1Ev();
extern void _ZN3ccc8FF2x7y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y10E[] = {
  NSPAIR(_ZN3ccc8FF2x7y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x7y103abcEv();
extern void _ZN3ccc8FF2x7y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y10E[] = {
  {&(_ZTVN3ccc8FF2x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y10E[];
static VTBL_ENTRY alt_thunk_names603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y10E = {  "_ZN3ccc8FF2x7y10E", // class name
  bases__ZN3ccc8FF2x7y10E, 2,
  &(vtc__ZN3ccc8FF2x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names603,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y11  : virtual ::ccc::EE2x7 {
  virtual void  pqr(); // _ZN3ccc8FF2x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x7y113efgEv
  ~FF2x7y11(); // tgen
  FF2x7y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x7y113pqrEv");}
void  ccc::FF2x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x7y113efgEv");}
ccc::FF2x7y11 ::~FF2x7y11(){ note_dtor("_ZN3ccc8FF2x7y11E", this);} // tgen
ccc::FF2x7y11 ::FF2x7y11(){ note_ctor("_ZN3ccc8FF2x7y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y11E, buf);
    ::ccc::FF2x7y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y11E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y11E);
    dp->::ccc::FF2x7y11::~FF2x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y11E(Test__ZN3ccc8FF2x7y11E, "_ZN3ccc8FF2x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y11C1Ev();
extern void _ZN3ccc8FF2x7y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y11E[] = {
  NSPAIR(_ZN3ccc8FF2x7y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y11E[];
extern void _ZN3ccc8FF2x7y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x7y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y11E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y11E[] = {
  {&(_ZTVN3ccc8FF2x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y11E[];
static VTBL_ENTRY alt_thunk_names604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y11E = {  "_ZN3ccc8FF2x7y11E", // class name
  bases__ZN3ccc8FF2x7y11E, 2,
  &(vtc__ZN3ccc8FF2x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names604,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y12  : virtual ::ccc::EE2x7 {
  virtual void  abc(); // _ZN3ccc8FF2x7y123abcEv
  ~FF2x7y12(); // tgen
  FF2x7y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x7y123abcEv");}
ccc::FF2x7y12 ::~FF2x7y12(){ note_dtor("_ZN3ccc8FF2x7y12E", this);} // tgen
ccc::FF2x7y12 ::FF2x7y12(){ note_ctor("_ZN3ccc8FF2x7y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y12E, buf);
    ::ccc::FF2x7y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y12E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y12E);
    dp->::ccc::FF2x7y12::~FF2x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y12E(Test__ZN3ccc8FF2x7y12E, "_ZN3ccc8FF2x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y12C1Ev();
extern void _ZN3ccc8FF2x7y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y12E[] = {
  NSPAIR(_ZN3ccc8FF2x7y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x7y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y12E[] = {
  {&(_ZTVN3ccc8FF2x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y12E[];
static VTBL_ENTRY alt_thunk_names605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y12E = {  "_ZN3ccc8FF2x7y12E", // class name
  bases__ZN3ccc8FF2x7y12E, 2,
  &(vtc__ZN3ccc8FF2x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names605,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y13  : virtual ::ccc::EE2x7 {
  virtual void  efg(); // _ZN3ccc8FF2x7y133efgEv
  ~FF2x7y13(); // tgen
  FF2x7y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x7y133efgEv");}
ccc::FF2x7y13 ::~FF2x7y13(){ note_dtor("_ZN3ccc8FF2x7y13E", this);} // tgen
ccc::FF2x7y13 ::FF2x7y13(){ note_ctor("_ZN3ccc8FF2x7y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y13E, buf);
    ::ccc::FF2x7y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y13E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y13E);
    dp->::ccc::FF2x7y13::~FF2x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y13E(Test__ZN3ccc8FF2x7y13E, "_ZN3ccc8FF2x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y13C1Ev();
extern void _ZN3ccc8FF2x7y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y13E[] = {
  NSPAIR(_ZN3ccc8FF2x7y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y13E[];
extern void _ZN3ccc8FF2x7y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y13E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y13E[] = {
  {&(_ZTVN3ccc8FF2x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y13E[];
static VTBL_ENTRY alt_thunk_names606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y13E = {  "_ZN3ccc8FF2x7y13E", // class name
  bases__ZN3ccc8FF2x7y13E, 2,
  &(vtc__ZN3ccc8FF2x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names606,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y14  : virtual ::ccc::EE2x7 {
  virtual void  pqr(); // _ZN3ccc8FF2x7y143pqrEv
  ~FF2x7y14(); // tgen
  FF2x7y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x7y143pqrEv");}
ccc::FF2x7y14 ::~FF2x7y14(){ note_dtor("_ZN3ccc8FF2x7y14E", this);} // tgen
ccc::FF2x7y14 ::FF2x7y14(){ note_ctor("_ZN3ccc8FF2x7y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y14E, buf);
    ::ccc::FF2x7y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y14E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y14E);
    dp->::ccc::FF2x7y14::~FF2x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y14E(Test__ZN3ccc8FF2x7y14E, "_ZN3ccc8FF2x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y14C1Ev();
extern void _ZN3ccc8FF2x7y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y14E[] = {
  NSPAIR(_ZN3ccc8FF2x7y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x7y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x7y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y14E[] = {
  {&(_ZTVN3ccc8FF2x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y14E[];
static VTBL_ENTRY alt_thunk_names607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y14E = {  "_ZN3ccc8FF2x7y14E", // class name
  bases__ZN3ccc8FF2x7y14E, 2,
  &(vtc__ZN3ccc8FF2x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names607,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x7y15  : virtual ::ccc::EE2x7 {
  ~FF2x7y15(); // tgen
  FF2x7y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x7y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2}}
}
namespace ccc { 
ccc::FF2x7y15 ::~FF2x7y15(){ note_dtor("_ZN3ccc8FF2x7y15E", this);} // tgen
ccc::FF2x7y15 ::FF2x7y15(){ note_ctor("_ZN3ccc8FF2x7y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x7y15E, buf);
    ::ccc::FF2x7y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x7y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y15E");
    check_base_class_offset(lv, (::ccc::EE2x7*), 0, "_ZN3ccc8FF2x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x7y15E);
    dp->::ccc::FF2x7y15::~FF2x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x7y15E(Test__ZN3ccc8FF2x7y15E, "_ZN3ccc8FF2x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x7y15C1Ev();
extern void _ZN3ccc8FF2x7y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x7y15E[] = {
  NSPAIR(_ZN3ccc8FF2x7y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x7E[];
static Base_Class bases__ZN3ccc8FF2x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x7y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv)();
extern void _ZN3ccc5EE2x73abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv)();
extern void _ZN3ccc5EE2x73pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x7y15E[] = {
  {&(_ZTVN3ccc8FF2x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x7y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x7E__NS_8FF2x7y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x7y15E[];
static VTBL_ENTRY alt_thunk_names608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x73pqrEv,_ZTv0_n20_N3ccc5EE2x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x73abcEv,_ZTv0_n16_N3ccc5EE2x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x7y15E = {  "_ZN3ccc8FF2x7y15E", // class name
  bases__ZN3ccc8FF2x7y15E, 2,
  &(vtc__ZN3ccc8FF2x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x7y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x7y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x7y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x7y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names608,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y0  : virtual ::ccc::EE2x8 {
  virtual void  abc(); // _ZN3ccc7FF2x8y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y03pqrEv
  ~FF2x8y0(); // tgen
  FF2x8y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y03abcEv");}
void  ccc::FF2x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y03efgEv");}
void  ccc::FF2x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y03pqrEv");}
ccc::FF2x8y0 ::~FF2x8y0(){ note_dtor("_ZN3ccc7FF2x8y0E", this);} // tgen
ccc::FF2x8y0 ::FF2x8y0(){ note_ctor("_ZN3ccc7FF2x8y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y0E, buf);
    ::ccc::FF2x8y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y0E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y0E);
    dp->::ccc::FF2x8y0::~FF2x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y0E(Test__ZN3ccc7FF2x8y0E, "_ZN3ccc7FF2x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y0C1Ev();
extern void _ZN3ccc7FF2x8y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y0E[] = {
  NSPAIR(_ZN3ccc7FF2x8y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y0E[];
extern void _ZN3ccc7FF2x8y03efgEv();
extern void _ZN3ccc7FF2x8y03abcEv();
extern void _ZN3ccc7FF2x8y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y0E[] = {
  {&(_ZTVN3ccc7FF2x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y0E[];
static VTBL_ENTRY alt_thunk_names609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y0E = {  "_ZN3ccc7FF2x8y0E", // class name
  bases__ZN3ccc7FF2x8y0E, 2,
  &(vtc__ZN3ccc7FF2x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names609,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y1  : virtual ::ccc::EE2x8 {
  virtual void  abc(); // _ZN3ccc7FF2x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x8y13efgEv
  ~FF2x8y1(); // tgen
  FF2x8y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y13abcEv");}
void  ccc::FF2x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y13pqrEv");}
void  ccc::FF2x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y13efgEv");}
ccc::FF2x8y1 ::~FF2x8y1(){ note_dtor("_ZN3ccc7FF2x8y1E", this);} // tgen
ccc::FF2x8y1 ::FF2x8y1(){ note_ctor("_ZN3ccc7FF2x8y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y1E, buf);
    ::ccc::FF2x8y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y1E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y1E);
    dp->::ccc::FF2x8y1::~FF2x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y1E(Test__ZN3ccc7FF2x8y1E, "_ZN3ccc7FF2x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y1C1Ev();
extern void _ZN3ccc7FF2x8y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y1E[] = {
  NSPAIR(_ZN3ccc7FF2x8y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y1E[];
extern void _ZN3ccc7FF2x8y13efgEv();
extern void _ZN3ccc7FF2x8y13abcEv();
extern void _ZN3ccc7FF2x8y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y1E[] = {
  {&(_ZTVN3ccc7FF2x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y1E[];
static VTBL_ENTRY alt_thunk_names610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y1E = {  "_ZN3ccc7FF2x8y1E", // class name
  bases__ZN3ccc7FF2x8y1E, 2,
  &(vtc__ZN3ccc7FF2x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names610,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y2  : virtual ::ccc::EE2x8 {
  virtual void  efg(); // _ZN3ccc7FF2x8y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y23pqrEv
  ~FF2x8y2(); // tgen
  FF2x8y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y23efgEv");}
void  ccc::FF2x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y23abcEv");}
void  ccc::FF2x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y23pqrEv");}
ccc::FF2x8y2 ::~FF2x8y2(){ note_dtor("_ZN3ccc7FF2x8y2E", this);} // tgen
ccc::FF2x8y2 ::FF2x8y2(){ note_ctor("_ZN3ccc7FF2x8y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y2E, buf);
    ::ccc::FF2x8y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y2E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y2E);
    dp->::ccc::FF2x8y2::~FF2x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y2E(Test__ZN3ccc7FF2x8y2E, "_ZN3ccc7FF2x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y2C1Ev();
extern void _ZN3ccc7FF2x8y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y2E[] = {
  NSPAIR(_ZN3ccc7FF2x8y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y2E[];
extern void _ZN3ccc7FF2x8y23efgEv();
extern void _ZN3ccc7FF2x8y23abcEv();
extern void _ZN3ccc7FF2x8y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y2E[] = {
  {&(_ZTVN3ccc7FF2x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y2E[];
static VTBL_ENTRY alt_thunk_names611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y2E = {  "_ZN3ccc7FF2x8y2E", // class name
  bases__ZN3ccc7FF2x8y2E, 2,
  &(vtc__ZN3ccc7FF2x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names611,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y3  : virtual ::ccc::EE2x8 {
  virtual void  efg(); // _ZN3ccc7FF2x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x8y33abcEv
  ~FF2x8y3(); // tgen
  FF2x8y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y33efgEv");}
void  ccc::FF2x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y33pqrEv");}
void  ccc::FF2x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y33abcEv");}
ccc::FF2x8y3 ::~FF2x8y3(){ note_dtor("_ZN3ccc7FF2x8y3E", this);} // tgen
ccc::FF2x8y3 ::FF2x8y3(){ note_ctor("_ZN3ccc7FF2x8y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y3E, buf);
    ::ccc::FF2x8y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y3E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y3E);
    dp->::ccc::FF2x8y3::~FF2x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y3E(Test__ZN3ccc7FF2x8y3E, "_ZN3ccc7FF2x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y3C1Ev();
extern void _ZN3ccc7FF2x8y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y3E[] = {
  NSPAIR(_ZN3ccc7FF2x8y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y3E[];
extern void _ZN3ccc7FF2x8y33efgEv();
extern void _ZN3ccc7FF2x8y33abcEv();
extern void _ZN3ccc7FF2x8y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y3E[] = {
  {&(_ZTVN3ccc7FF2x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y3E[];
static VTBL_ENTRY alt_thunk_names612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y3E = {  "_ZN3ccc7FF2x8y3E", // class name
  bases__ZN3ccc7FF2x8y3E, 2,
  &(vtc__ZN3ccc7FF2x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names612,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y4  : virtual ::ccc::EE2x8 {
  virtual void  pqr(); // _ZN3ccc7FF2x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x8y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x8y43efgEv
  ~FF2x8y4(); // tgen
  FF2x8y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y43pqrEv");}
void  ccc::FF2x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y43abcEv");}
void  ccc::FF2x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y43efgEv");}
ccc::FF2x8y4 ::~FF2x8y4(){ note_dtor("_ZN3ccc7FF2x8y4E", this);} // tgen
ccc::FF2x8y4 ::FF2x8y4(){ note_ctor("_ZN3ccc7FF2x8y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y4E, buf);
    ::ccc::FF2x8y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y4E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y4E);
    dp->::ccc::FF2x8y4::~FF2x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y4E(Test__ZN3ccc7FF2x8y4E, "_ZN3ccc7FF2x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y4C1Ev();
extern void _ZN3ccc7FF2x8y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y4E[] = {
  NSPAIR(_ZN3ccc7FF2x8y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y4E[];
extern void _ZN3ccc7FF2x8y43efgEv();
extern void _ZN3ccc7FF2x8y43abcEv();
extern void _ZN3ccc7FF2x8y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y4E[] = {
  {&(_ZTVN3ccc7FF2x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y4E[];
static VTBL_ENTRY alt_thunk_names613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y4E = {  "_ZN3ccc7FF2x8y4E", // class name
  bases__ZN3ccc7FF2x8y4E, 2,
  &(vtc__ZN3ccc7FF2x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names613,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y5  : virtual ::ccc::EE2x8 {
  virtual void  pqr(); // _ZN3ccc7FF2x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x8y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x8y53abcEv
  ~FF2x8y5(); // tgen
  FF2x8y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y53pqrEv");}
void  ccc::FF2x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y53efgEv");}
void  ccc::FF2x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y53abcEv");}
ccc::FF2x8y5 ::~FF2x8y5(){ note_dtor("_ZN3ccc7FF2x8y5E", this);} // tgen
ccc::FF2x8y5 ::FF2x8y5(){ note_ctor("_ZN3ccc7FF2x8y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y5E, buf);
    ::ccc::FF2x8y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y5E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y5E);
    dp->::ccc::FF2x8y5::~FF2x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y5E(Test__ZN3ccc7FF2x8y5E, "_ZN3ccc7FF2x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y5C1Ev();
extern void _ZN3ccc7FF2x8y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y5E[] = {
  NSPAIR(_ZN3ccc7FF2x8y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y5E[];
extern void _ZN3ccc7FF2x8y53efgEv();
extern void _ZN3ccc7FF2x8y53abcEv();
extern void _ZN3ccc7FF2x8y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y5E[] = {
  {&(_ZTVN3ccc7FF2x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y5E[];
static VTBL_ENTRY alt_thunk_names614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y5E = {  "_ZN3ccc7FF2x8y5E", // class name
  bases__ZN3ccc7FF2x8y5E, 2,
  &(vtc__ZN3ccc7FF2x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names614,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y6  : virtual ::ccc::EE2x8 {
  virtual void  abc(); // _ZN3ccc7FF2x8y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x8y63efgEv
  ~FF2x8y6(); // tgen
  FF2x8y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y63abcEv");}
void  ccc::FF2x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y63efgEv");}
ccc::FF2x8y6 ::~FF2x8y6(){ note_dtor("_ZN3ccc7FF2x8y6E", this);} // tgen
ccc::FF2x8y6 ::FF2x8y6(){ note_ctor("_ZN3ccc7FF2x8y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y6E, buf);
    ::ccc::FF2x8y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y6E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y6E);
    dp->::ccc::FF2x8y6::~FF2x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y6E(Test__ZN3ccc7FF2x8y6E, "_ZN3ccc7FF2x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y6C1Ev();
extern void _ZN3ccc7FF2x8y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y6E[] = {
  NSPAIR(_ZN3ccc7FF2x8y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y6E[];
extern void _ZN3ccc7FF2x8y63efgEv();
extern void _ZN3ccc7FF2x8y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y6E[] = {
  {&(_ZTVN3ccc7FF2x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y6E[];
static VTBL_ENTRY alt_thunk_names615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y6E = {  "_ZN3ccc7FF2x8y6E", // class name
  bases__ZN3ccc7FF2x8y6E, 2,
  &(vtc__ZN3ccc7FF2x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names615,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y7  : virtual ::ccc::EE2x8 {
  virtual void  abc(); // _ZN3ccc7FF2x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y73pqrEv
  ~FF2x8y7(); // tgen
  FF2x8y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y73abcEv");}
void  ccc::FF2x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y73pqrEv");}
ccc::FF2x8y7 ::~FF2x8y7(){ note_dtor("_ZN3ccc7FF2x8y7E", this);} // tgen
ccc::FF2x8y7 ::FF2x8y7(){ note_ctor("_ZN3ccc7FF2x8y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y7E, buf);
    ::ccc::FF2x8y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y7E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y7E);
    dp->::ccc::FF2x8y7::~FF2x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y7E(Test__ZN3ccc7FF2x8y7E, "_ZN3ccc7FF2x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y7C1Ev();
extern void _ZN3ccc7FF2x8y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y7E[] = {
  NSPAIR(_ZN3ccc7FF2x8y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x8y73abcEv();
extern void _ZN3ccc7FF2x8y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y7E[] = {
  {&(_ZTVN3ccc7FF2x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y7E[];
static VTBL_ENTRY alt_thunk_names616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y7E = {  "_ZN3ccc7FF2x8y7E", // class name
  bases__ZN3ccc7FF2x8y7E, 2,
  &(vtc__ZN3ccc7FF2x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names616,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y8  : virtual ::ccc::EE2x8 {
  virtual void  efg(); // _ZN3ccc7FF2x8y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x8y83abcEv
  ~FF2x8y8(); // tgen
  FF2x8y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y83efgEv");}
void  ccc::FF2x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x8y83abcEv");}
ccc::FF2x8y8 ::~FF2x8y8(){ note_dtor("_ZN3ccc7FF2x8y8E", this);} // tgen
ccc::FF2x8y8 ::FF2x8y8(){ note_ctor("_ZN3ccc7FF2x8y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y8E, buf);
    ::ccc::FF2x8y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y8E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y8E);
    dp->::ccc::FF2x8y8::~FF2x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y8E(Test__ZN3ccc7FF2x8y8E, "_ZN3ccc7FF2x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y8C1Ev();
extern void _ZN3ccc7FF2x8y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y8E[] = {
  NSPAIR(_ZN3ccc7FF2x8y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y8E[];
extern void _ZN3ccc7FF2x8y83efgEv();
extern void _ZN3ccc7FF2x8y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y8E[] = {
  {&(_ZTVN3ccc7FF2x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y8E[];
static VTBL_ENTRY alt_thunk_names617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y8E = {  "_ZN3ccc7FF2x8y8E", // class name
  bases__ZN3ccc7FF2x8y8E, 2,
  &(vtc__ZN3ccc7FF2x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names617,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y9  : virtual ::ccc::EE2x8 {
  virtual void  efg(); // _ZN3ccc7FF2x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x8y93pqrEv
  ~FF2x8y9(); // tgen
  FF2x8y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x8y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x8y93efgEv");}
void  ccc::FF2x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x8y93pqrEv");}
ccc::FF2x8y9 ::~FF2x8y9(){ note_dtor("_ZN3ccc7FF2x8y9E", this);} // tgen
ccc::FF2x8y9 ::FF2x8y9(){ note_ctor("_ZN3ccc7FF2x8y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x8y9E, buf);
    ::ccc::FF2x8y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x8y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y9E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc7FF2x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x8y9E);
    dp->::ccc::FF2x8y9::~FF2x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x8y9E(Test__ZN3ccc7FF2x8y9E, "_ZN3ccc7FF2x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x8y9C1Ev();
extern void _ZN3ccc7FF2x8y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x8y9E[] = {
  NSPAIR(_ZN3ccc7FF2x8y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc7FF2x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y9E[];
extern void _ZN3ccc7FF2x8y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc7FF2x8y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x8y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x8y9E[] = {
  {&(_ZTVN3ccc7FF2x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x8y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_7FF2x8y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x8y9E[];
static VTBL_ENTRY alt_thunk_names618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x8y9E = {  "_ZN3ccc7FF2x8y9E", // class name
  bases__ZN3ccc7FF2x8y9E, 2,
  &(vtc__ZN3ccc7FF2x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x8y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x8y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x8y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x8y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names618,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y10  : virtual ::ccc::EE2x8 {
  virtual void  pqr(); // _ZN3ccc8FF2x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x8y103abcEv
  ~FF2x8y10(); // tgen
  FF2x8y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x8y103pqrEv");}
void  ccc::FF2x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x8y103abcEv");}
ccc::FF2x8y10 ::~FF2x8y10(){ note_dtor("_ZN3ccc8FF2x8y10E", this);} // tgen
ccc::FF2x8y10 ::FF2x8y10(){ note_ctor("_ZN3ccc8FF2x8y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y10E, buf);
    ::ccc::FF2x8y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y10E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y10E);
    dp->::ccc::FF2x8y10::~FF2x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y10E(Test__ZN3ccc8FF2x8y10E, "_ZN3ccc8FF2x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y10C1Ev();
extern void _ZN3ccc8FF2x8y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y10E[] = {
  NSPAIR(_ZN3ccc8FF2x8y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x8y103abcEv();
extern void _ZN3ccc8FF2x8y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y10E[] = {
  {&(_ZTVN3ccc8FF2x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y10E[];
static VTBL_ENTRY alt_thunk_names619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y10E = {  "_ZN3ccc8FF2x8y10E", // class name
  bases__ZN3ccc8FF2x8y10E, 2,
  &(vtc__ZN3ccc8FF2x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names619,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y11  : virtual ::ccc::EE2x8 {
  virtual void  pqr(); // _ZN3ccc8FF2x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x8y113efgEv
  ~FF2x8y11(); // tgen
  FF2x8y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x8y113pqrEv");}
void  ccc::FF2x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x8y113efgEv");}
ccc::FF2x8y11 ::~FF2x8y11(){ note_dtor("_ZN3ccc8FF2x8y11E", this);} // tgen
ccc::FF2x8y11 ::FF2x8y11(){ note_ctor("_ZN3ccc8FF2x8y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y11E, buf);
    ::ccc::FF2x8y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y11E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y11E);
    dp->::ccc::FF2x8y11::~FF2x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y11E(Test__ZN3ccc8FF2x8y11E, "_ZN3ccc8FF2x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y11C1Ev();
extern void _ZN3ccc8FF2x8y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y11E[] = {
  NSPAIR(_ZN3ccc8FF2x8y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y11E[];
extern void _ZN3ccc8FF2x8y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x8y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y11E[] = {
  {&(_ZTVN3ccc8FF2x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y11E[];
static VTBL_ENTRY alt_thunk_names620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y11E = {  "_ZN3ccc8FF2x8y11E", // class name
  bases__ZN3ccc8FF2x8y11E, 2,
  &(vtc__ZN3ccc8FF2x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names620,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y12  : virtual ::ccc::EE2x8 {
  virtual void  abc(); // _ZN3ccc8FF2x8y123abcEv
  ~FF2x8y12(); // tgen
  FF2x8y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x8y123abcEv");}
ccc::FF2x8y12 ::~FF2x8y12(){ note_dtor("_ZN3ccc8FF2x8y12E", this);} // tgen
ccc::FF2x8y12 ::FF2x8y12(){ note_ctor("_ZN3ccc8FF2x8y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y12E, buf);
    ::ccc::FF2x8y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y12E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y12E);
    dp->::ccc::FF2x8y12::~FF2x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y12E(Test__ZN3ccc8FF2x8y12E, "_ZN3ccc8FF2x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y12C1Ev();
extern void _ZN3ccc8FF2x8y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y12E[] = {
  NSPAIR(_ZN3ccc8FF2x8y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x8y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y12E[] = {
  {&(_ZTVN3ccc8FF2x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y12E[];
static VTBL_ENTRY alt_thunk_names621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y12E = {  "_ZN3ccc8FF2x8y12E", // class name
  bases__ZN3ccc8FF2x8y12E, 2,
  &(vtc__ZN3ccc8FF2x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names621,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y13  : virtual ::ccc::EE2x8 {
  virtual void  efg(); // _ZN3ccc8FF2x8y133efgEv
  ~FF2x8y13(); // tgen
  FF2x8y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x8y133efgEv");}
ccc::FF2x8y13 ::~FF2x8y13(){ note_dtor("_ZN3ccc8FF2x8y13E", this);} // tgen
ccc::FF2x8y13 ::FF2x8y13(){ note_ctor("_ZN3ccc8FF2x8y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y13E, buf);
    ::ccc::FF2x8y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y13E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y13E);
    dp->::ccc::FF2x8y13::~FF2x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y13E(Test__ZN3ccc8FF2x8y13E, "_ZN3ccc8FF2x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y13C1Ev();
extern void _ZN3ccc8FF2x8y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y13E[] = {
  NSPAIR(_ZN3ccc8FF2x8y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y13E[];
extern void _ZN3ccc8FF2x8y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y13E[] = {
  {&(_ZTVN3ccc8FF2x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y13E[];
static VTBL_ENTRY alt_thunk_names622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y13E = {  "_ZN3ccc8FF2x8y13E", // class name
  bases__ZN3ccc8FF2x8y13E, 2,
  &(vtc__ZN3ccc8FF2x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names622,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y14  : virtual ::ccc::EE2x8 {
  virtual void  pqr(); // _ZN3ccc8FF2x8y143pqrEv
  ~FF2x8y14(); // tgen
  FF2x8y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x8y143pqrEv");}
ccc::FF2x8y14 ::~FF2x8y14(){ note_dtor("_ZN3ccc8FF2x8y14E", this);} // tgen
ccc::FF2x8y14 ::FF2x8y14(){ note_ctor("_ZN3ccc8FF2x8y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y14E, buf);
    ::ccc::FF2x8y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y14E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y14E);
    dp->::ccc::FF2x8y14::~FF2x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y14E(Test__ZN3ccc8FF2x8y14E, "_ZN3ccc8FF2x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y14C1Ev();
extern void _ZN3ccc8FF2x8y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y14E[] = {
  NSPAIR(_ZN3ccc8FF2x8y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x8y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x8y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y14E[] = {
  {&(_ZTVN3ccc8FF2x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y14E[];
static VTBL_ENTRY alt_thunk_names623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y14E = {  "_ZN3ccc8FF2x8y14E", // class name
  bases__ZN3ccc8FF2x8y14E, 2,
  &(vtc__ZN3ccc8FF2x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names623,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x8y15  : virtual ::ccc::EE2x8 {
  ~FF2x8y15(); // tgen
  FF2x8y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x8y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2}}
}
namespace ccc { 
ccc::FF2x8y15 ::~FF2x8y15(){ note_dtor("_ZN3ccc8FF2x8y15E", this);} // tgen
ccc::FF2x8y15 ::FF2x8y15(){ note_ctor("_ZN3ccc8FF2x8y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x8y15E, buf);
    ::ccc::FF2x8y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x8y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y15E");
    check_base_class_offset(lv, (::ccc::EE2x8*), 0, "_ZN3ccc8FF2x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x8y15E);
    dp->::ccc::FF2x8y15::~FF2x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x8y15E(Test__ZN3ccc8FF2x8y15E, "_ZN3ccc8FF2x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x8y15C1Ev();
extern void _ZN3ccc8FF2x8y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x8y15E[] = {
  NSPAIR(_ZN3ccc8FF2x8y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x8E[];
static Base_Class bases__ZN3ccc8FF2x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x8y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv)();
extern void _ZN3ccc5EE2x83efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv)();
extern void _ZN3ccc5EE2x83abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x8y15E[] = {
  {&(_ZTVN3ccc8FF2x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x8y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x8E__NS_8FF2x8y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x8y15E[];
static VTBL_ENTRY alt_thunk_names624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE2x83abcEv,_ZTv0_n16_N3ccc5EE2x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x83efgEv,_ZTv0_n12_N3ccc5EE2x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x8y15E = {  "_ZN3ccc8FF2x8y15E", // class name
  bases__ZN3ccc8FF2x8y15E, 2,
  &(vtc__ZN3ccc8FF2x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x8y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x8y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x8y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x8y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names624,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y0  : virtual ::ccc::EE2x9 {
  virtual void  abc(); // _ZN3ccc7FF2x9y03abcEv
  virtual void  efg(); // _ZN3ccc7FF2x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y03pqrEv
  ~FF2x9y0(); // tgen
  FF2x9y0(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y03abcEv");}
void  ccc::FF2x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y03efgEv");}
void  ccc::FF2x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y03pqrEv");}
ccc::FF2x9y0 ::~FF2x9y0(){ note_dtor("_ZN3ccc7FF2x9y0E", this);} // tgen
ccc::FF2x9y0 ::FF2x9y0(){ note_ctor("_ZN3ccc7FF2x9y0E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y0E, buf);
    ::ccc::FF2x9y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y0E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y0E);
    dp->::ccc::FF2x9y0::~FF2x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y0E(Test__ZN3ccc7FF2x9y0E, "_ZN3ccc7FF2x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y0C1Ev();
extern void _ZN3ccc7FF2x9y0D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y0E[] = {
  NSPAIR(_ZN3ccc7FF2x9y0C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y0E[];
extern void _ZN3ccc7FF2x9y03efgEv();
extern void _ZN3ccc7FF2x9y03abcEv();
extern void _ZN3ccc7FF2x9y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y0E[] = {
  {&(_ZTVN3ccc7FF2x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y0E[];
static VTBL_ENTRY alt_thunk_names625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y0E = {  "_ZN3ccc7FF2x9y0E", // class name
  bases__ZN3ccc7FF2x9y0E, 2,
  &(vtc__ZN3ccc7FF2x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names625,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y1  : virtual ::ccc::EE2x9 {
  virtual void  abc(); // _ZN3ccc7FF2x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x9y13efgEv
  ~FF2x9y1(); // tgen
  FF2x9y1(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y13abcEv");}
void  ccc::FF2x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y13pqrEv");}
void  ccc::FF2x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y13efgEv");}
ccc::FF2x9y1 ::~FF2x9y1(){ note_dtor("_ZN3ccc7FF2x9y1E", this);} // tgen
ccc::FF2x9y1 ::FF2x9y1(){ note_ctor("_ZN3ccc7FF2x9y1E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y1E, buf);
    ::ccc::FF2x9y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y1E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y1E);
    dp->::ccc::FF2x9y1::~FF2x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y1E(Test__ZN3ccc7FF2x9y1E, "_ZN3ccc7FF2x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y1C1Ev();
extern void _ZN3ccc7FF2x9y1D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y1E[] = {
  NSPAIR(_ZN3ccc7FF2x9y1C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y1E[];
extern void _ZN3ccc7FF2x9y13efgEv();
extern void _ZN3ccc7FF2x9y13abcEv();
extern void _ZN3ccc7FF2x9y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y1E[] = {
  {&(_ZTVN3ccc7FF2x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y1E[];
static VTBL_ENTRY alt_thunk_names626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y1E = {  "_ZN3ccc7FF2x9y1E", // class name
  bases__ZN3ccc7FF2x9y1E, 2,
  &(vtc__ZN3ccc7FF2x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names626,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y2  : virtual ::ccc::EE2x9 {
  virtual void  efg(); // _ZN3ccc7FF2x9y23efgEv
  virtual void  abc(); // _ZN3ccc7FF2x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y23pqrEv
  ~FF2x9y2(); // tgen
  FF2x9y2(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y23efgEv");}
void  ccc::FF2x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y23abcEv");}
void  ccc::FF2x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y23pqrEv");}
ccc::FF2x9y2 ::~FF2x9y2(){ note_dtor("_ZN3ccc7FF2x9y2E", this);} // tgen
ccc::FF2x9y2 ::FF2x9y2(){ note_ctor("_ZN3ccc7FF2x9y2E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y2E, buf);
    ::ccc::FF2x9y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y2E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y2E);
    dp->::ccc::FF2x9y2::~FF2x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y2E(Test__ZN3ccc7FF2x9y2E, "_ZN3ccc7FF2x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y2C1Ev();
extern void _ZN3ccc7FF2x9y2D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y2E[] = {
  NSPAIR(_ZN3ccc7FF2x9y2C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y2E[];
extern void _ZN3ccc7FF2x9y23efgEv();
extern void _ZN3ccc7FF2x9y23abcEv();
extern void _ZN3ccc7FF2x9y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y2E[] = {
  {&(_ZTVN3ccc7FF2x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y2E[];
static VTBL_ENTRY alt_thunk_names627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y2E = {  "_ZN3ccc7FF2x9y2E", // class name
  bases__ZN3ccc7FF2x9y2E, 2,
  &(vtc__ZN3ccc7FF2x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names627,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y3  : virtual ::ccc::EE2x9 {
  virtual void  efg(); // _ZN3ccc7FF2x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x9y33abcEv
  ~FF2x9y3(); // tgen
  FF2x9y3(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y33efgEv");}
void  ccc::FF2x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y33pqrEv");}
void  ccc::FF2x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y33abcEv");}
ccc::FF2x9y3 ::~FF2x9y3(){ note_dtor("_ZN3ccc7FF2x9y3E", this);} // tgen
ccc::FF2x9y3 ::FF2x9y3(){ note_ctor("_ZN3ccc7FF2x9y3E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y3E, buf);
    ::ccc::FF2x9y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y3E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y3E);
    dp->::ccc::FF2x9y3::~FF2x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y3E(Test__ZN3ccc7FF2x9y3E, "_ZN3ccc7FF2x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y3C1Ev();
extern void _ZN3ccc7FF2x9y3D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y3E[] = {
  NSPAIR(_ZN3ccc7FF2x9y3C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y3E[];
extern void _ZN3ccc7FF2x9y33efgEv();
extern void _ZN3ccc7FF2x9y33abcEv();
extern void _ZN3ccc7FF2x9y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y3E[] = {
  {&(_ZTVN3ccc7FF2x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y3E[];
static VTBL_ENTRY alt_thunk_names628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y3E = {  "_ZN3ccc7FF2x9y3E", // class name
  bases__ZN3ccc7FF2x9y3E, 2,
  &(vtc__ZN3ccc7FF2x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names628,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y4  : virtual ::ccc::EE2x9 {
  virtual void  pqr(); // _ZN3ccc7FF2x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF2x9y43abcEv
  virtual void  efg(); // _ZN3ccc7FF2x9y43efgEv
  ~FF2x9y4(); // tgen
  FF2x9y4(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y43pqrEv");}
void  ccc::FF2x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y43abcEv");}
void  ccc::FF2x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y43efgEv");}
ccc::FF2x9y4 ::~FF2x9y4(){ note_dtor("_ZN3ccc7FF2x9y4E", this);} // tgen
ccc::FF2x9y4 ::FF2x9y4(){ note_ctor("_ZN3ccc7FF2x9y4E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y4E, buf);
    ::ccc::FF2x9y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y4E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y4E);
    dp->::ccc::FF2x9y4::~FF2x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y4E(Test__ZN3ccc7FF2x9y4E, "_ZN3ccc7FF2x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y4C1Ev();
extern void _ZN3ccc7FF2x9y4D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y4E[] = {
  NSPAIR(_ZN3ccc7FF2x9y4C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y4E[];
extern void _ZN3ccc7FF2x9y43efgEv();
extern void _ZN3ccc7FF2x9y43abcEv();
extern void _ZN3ccc7FF2x9y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y4E[] = {
  {&(_ZTVN3ccc7FF2x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y4E[];
static VTBL_ENTRY alt_thunk_names629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y4E = {  "_ZN3ccc7FF2x9y4E", // class name
  bases__ZN3ccc7FF2x9y4E, 2,
  &(vtc__ZN3ccc7FF2x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names629,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y5  : virtual ::ccc::EE2x9 {
  virtual void  pqr(); // _ZN3ccc7FF2x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF2x9y53efgEv
  virtual void  abc(); // _ZN3ccc7FF2x9y53abcEv
  ~FF2x9y5(); // tgen
  FF2x9y5(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y53pqrEv");}
void  ccc::FF2x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y53efgEv");}
void  ccc::FF2x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y53abcEv");}
ccc::FF2x9y5 ::~FF2x9y5(){ note_dtor("_ZN3ccc7FF2x9y5E", this);} // tgen
ccc::FF2x9y5 ::FF2x9y5(){ note_ctor("_ZN3ccc7FF2x9y5E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y5E, buf);
    ::ccc::FF2x9y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y5E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y5E);
    dp->::ccc::FF2x9y5::~FF2x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y5E(Test__ZN3ccc7FF2x9y5E, "_ZN3ccc7FF2x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y5C1Ev();
extern void _ZN3ccc7FF2x9y5D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y5E[] = {
  NSPAIR(_ZN3ccc7FF2x9y5C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y5E[];
extern void _ZN3ccc7FF2x9y53efgEv();
extern void _ZN3ccc7FF2x9y53abcEv();
extern void _ZN3ccc7FF2x9y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y5E[] = {
  {&(_ZTVN3ccc7FF2x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y5E[];
static VTBL_ENTRY alt_thunk_names630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y5E = {  "_ZN3ccc7FF2x9y5E", // class name
  bases__ZN3ccc7FF2x9y5E, 2,
  &(vtc__ZN3ccc7FF2x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names630,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y6  : virtual ::ccc::EE2x9 {
  virtual void  abc(); // _ZN3ccc7FF2x9y63abcEv
  virtual void  efg(); // _ZN3ccc7FF2x9y63efgEv
  ~FF2x9y6(); // tgen
  FF2x9y6(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y63abcEv");}
void  ccc::FF2x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y63efgEv");}
ccc::FF2x9y6 ::~FF2x9y6(){ note_dtor("_ZN3ccc7FF2x9y6E", this);} // tgen
ccc::FF2x9y6 ::FF2x9y6(){ note_ctor("_ZN3ccc7FF2x9y6E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y6E, buf);
    ::ccc::FF2x9y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y6E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y6E);
    dp->::ccc::FF2x9y6::~FF2x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y6E(Test__ZN3ccc7FF2x9y6E, "_ZN3ccc7FF2x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y6C1Ev();
extern void _ZN3ccc7FF2x9y6D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y6E[] = {
  NSPAIR(_ZN3ccc7FF2x9y6C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y6E[];
extern void _ZN3ccc7FF2x9y63efgEv();
extern void _ZN3ccc7FF2x9y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y6E[] = {
  {&(_ZTVN3ccc7FF2x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y6E[];
static VTBL_ENTRY alt_thunk_names631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y6E = {  "_ZN3ccc7FF2x9y6E", // class name
  bases__ZN3ccc7FF2x9y6E, 2,
  &(vtc__ZN3ccc7FF2x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names631,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y7  : virtual ::ccc::EE2x9 {
  virtual void  abc(); // _ZN3ccc7FF2x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y73pqrEv
  ~FF2x9y7(); // tgen
  FF2x9y7(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y73abcEv");}
void  ccc::FF2x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y73pqrEv");}
ccc::FF2x9y7 ::~FF2x9y7(){ note_dtor("_ZN3ccc7FF2x9y7E", this);} // tgen
ccc::FF2x9y7 ::FF2x9y7(){ note_ctor("_ZN3ccc7FF2x9y7E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y7E, buf);
    ::ccc::FF2x9y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y7E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y7E);
    dp->::ccc::FF2x9y7::~FF2x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y7E(Test__ZN3ccc7FF2x9y7E, "_ZN3ccc7FF2x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y7C1Ev();
extern void _ZN3ccc7FF2x9y7D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y7E[] = {
  NSPAIR(_ZN3ccc7FF2x9y7C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc7FF2x9y73abcEv();
extern void _ZN3ccc7FF2x9y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y7E[] = {
  {&(_ZTVN3ccc7FF2x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y7E[];
static VTBL_ENTRY alt_thunk_names632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y7E = {  "_ZN3ccc7FF2x9y7E", // class name
  bases__ZN3ccc7FF2x9y7E, 2,
  &(vtc__ZN3ccc7FF2x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names632,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y8  : virtual ::ccc::EE2x9 {
  virtual void  efg(); // _ZN3ccc7FF2x9y83efgEv
  virtual void  abc(); // _ZN3ccc7FF2x9y83abcEv
  ~FF2x9y8(); // tgen
  FF2x9y8(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y83efgEv");}
void  ccc::FF2x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF2x9y83abcEv");}
ccc::FF2x9y8 ::~FF2x9y8(){ note_dtor("_ZN3ccc7FF2x9y8E", this);} // tgen
ccc::FF2x9y8 ::FF2x9y8(){ note_ctor("_ZN3ccc7FF2x9y8E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y8E, buf);
    ::ccc::FF2x9y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y8E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y8E);
    dp->::ccc::FF2x9y8::~FF2x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y8E(Test__ZN3ccc7FF2x9y8E, "_ZN3ccc7FF2x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y8C1Ev();
extern void _ZN3ccc7FF2x9y8D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y8E[] = {
  NSPAIR(_ZN3ccc7FF2x9y8C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y8E[];
extern void _ZN3ccc7FF2x9y83efgEv();
extern void _ZN3ccc7FF2x9y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y8E[] = {
  {&(_ZTVN3ccc7FF2x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y8E[];
static VTBL_ENTRY alt_thunk_names633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y8E = {  "_ZN3ccc7FF2x9y8E", // class name
  bases__ZN3ccc7FF2x9y8E, 2,
  &(vtc__ZN3ccc7FF2x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names633,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y9  : virtual ::ccc::EE2x9 {
  virtual void  efg(); // _ZN3ccc7FF2x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF2x9y93pqrEv
  ~FF2x9y9(); // tgen
  FF2x9y9(); // tgen
};
//SIG(1 _ZN3ccc7FF2x9y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF2x9y93efgEv");}
void  ccc::FF2x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF2x9y93pqrEv");}
ccc::FF2x9y9 ::~FF2x9y9(){ note_dtor("_ZN3ccc7FF2x9y9E", this);} // tgen
ccc::FF2x9y9 ::FF2x9y9(){ note_ctor("_ZN3ccc7FF2x9y9E", this);} // tgen
}
static void Test__ZN3ccc7FF2x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF2x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF2x9y9E, buf);
    ::ccc::FF2x9y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF2x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF2x9y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y9E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc7FF2x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF2x9y9E);
    dp->::ccc::FF2x9y9::~FF2x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF2x9y9E(Test__ZN3ccc7FF2x9y9E, "_ZN3ccc7FF2x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF2x9y9C1Ev();
extern void _ZN3ccc7FF2x9y9D1Ev();
Name_Map name_map__ZN3ccc7FF2x9y9E[] = {
  NSPAIR(_ZN3ccc7FF2x9y9C1Ev),
  NSPAIR(_ZN3ccc7FF2x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc7FF2x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y9E[];
extern void _ZN3ccc7FF2x9y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7FF2x9y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF2x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF2x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF2x9y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF2x9y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF2x9y9E[] = {
  {&(_ZTVN3ccc7FF2x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF2x9y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_7FF2x9y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF2x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF2x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF2x9y9E[];
static VTBL_ENTRY alt_thunk_names634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF2x9y9E = {  "_ZN3ccc7FF2x9y9E", // class name
  bases__ZN3ccc7FF2x9y9E, 2,
  &(vtc__ZN3ccc7FF2x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF2x9y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF2x9y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF2x9y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF2x9y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names634,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y10  : virtual ::ccc::EE2x9 {
  virtual void  pqr(); // _ZN3ccc8FF2x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x9y103abcEv
  ~FF2x9y10(); // tgen
  FF2x9y10(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x9y103pqrEv");}
void  ccc::FF2x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x9y103abcEv");}
ccc::FF2x9y10 ::~FF2x9y10(){ note_dtor("_ZN3ccc8FF2x9y10E", this);} // tgen
ccc::FF2x9y10 ::FF2x9y10(){ note_ctor("_ZN3ccc8FF2x9y10E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y10E, buf);
    ::ccc::FF2x9y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y10E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y10E);
    dp->::ccc::FF2x9y10::~FF2x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y10E(Test__ZN3ccc8FF2x9y10E, "_ZN3ccc8FF2x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y10C1Ev();
extern void _ZN3ccc8FF2x9y10D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y10E[] = {
  NSPAIR(_ZN3ccc8FF2x9y10C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x9y103abcEv();
extern void _ZN3ccc8FF2x9y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y10E[] = {
  {&(_ZTVN3ccc8FF2x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y10E[];
static VTBL_ENTRY alt_thunk_names635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y10E = {  "_ZN3ccc8FF2x9y10E", // class name
  bases__ZN3ccc8FF2x9y10E, 2,
  &(vtc__ZN3ccc8FF2x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names635,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y11  : virtual ::ccc::EE2x9 {
  virtual void  pqr(); // _ZN3ccc8FF2x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x9y113efgEv
  ~FF2x9y11(); // tgen
  FF2x9y11(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x9y113pqrEv");}
void  ccc::FF2x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x9y113efgEv");}
ccc::FF2x9y11 ::~FF2x9y11(){ note_dtor("_ZN3ccc8FF2x9y11E", this);} // tgen
ccc::FF2x9y11 ::FF2x9y11(){ note_ctor("_ZN3ccc8FF2x9y11E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y11E, buf);
    ::ccc::FF2x9y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y11E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y11E);
    dp->::ccc::FF2x9y11::~FF2x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y11E(Test__ZN3ccc8FF2x9y11E, "_ZN3ccc8FF2x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y11C1Ev();
extern void _ZN3ccc8FF2x9y11D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y11E[] = {
  NSPAIR(_ZN3ccc8FF2x9y11C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y11E[];
extern void _ZN3ccc8FF2x9y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x9y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y11E[] = {
  {&(_ZTVN3ccc8FF2x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y11E[];
static VTBL_ENTRY alt_thunk_names636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y11E = {  "_ZN3ccc8FF2x9y11E", // class name
  bases__ZN3ccc8FF2x9y11E, 2,
  &(vtc__ZN3ccc8FF2x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names636,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y12  : virtual ::ccc::EE2x9 {
  virtual void  abc(); // _ZN3ccc8FF2x9y123abcEv
  ~FF2x9y12(); // tgen
  FF2x9y12(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x9y123abcEv");}
ccc::FF2x9y12 ::~FF2x9y12(){ note_dtor("_ZN3ccc8FF2x9y12E", this);} // tgen
ccc::FF2x9y12 ::FF2x9y12(){ note_ctor("_ZN3ccc8FF2x9y12E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y12E, buf);
    ::ccc::FF2x9y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y12E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y12E);
    dp->::ccc::FF2x9y12::~FF2x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y12E(Test__ZN3ccc8FF2x9y12E, "_ZN3ccc8FF2x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y12C1Ev();
extern void _ZN3ccc8FF2x9y12D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y12E[] = {
  NSPAIR(_ZN3ccc8FF2x9y12C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x9y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y12E[] = {
  {&(_ZTVN3ccc8FF2x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y12E[];
static VTBL_ENTRY alt_thunk_names637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y12E = {  "_ZN3ccc8FF2x9y12E", // class name
  bases__ZN3ccc8FF2x9y12E, 2,
  &(vtc__ZN3ccc8FF2x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names637,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y13  : virtual ::ccc::EE2x9 {
  virtual void  efg(); // _ZN3ccc8FF2x9y133efgEv
  ~FF2x9y13(); // tgen
  FF2x9y13(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x9y133efgEv");}
ccc::FF2x9y13 ::~FF2x9y13(){ note_dtor("_ZN3ccc8FF2x9y13E", this);} // tgen
ccc::FF2x9y13 ::FF2x9y13(){ note_ctor("_ZN3ccc8FF2x9y13E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y13E, buf);
    ::ccc::FF2x9y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y13E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y13E);
    dp->::ccc::FF2x9y13::~FF2x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y13E(Test__ZN3ccc8FF2x9y13E, "_ZN3ccc8FF2x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y13C1Ev();
extern void _ZN3ccc8FF2x9y13D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y13E[] = {
  NSPAIR(_ZN3ccc8FF2x9y13C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y13E[];
extern void _ZN3ccc8FF2x9y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y13E[] = {
  {&(_ZTVN3ccc8FF2x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y13E[];
static VTBL_ENTRY alt_thunk_names638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y13E = {  "_ZN3ccc8FF2x9y13E", // class name
  bases__ZN3ccc8FF2x9y13E, 2,
  &(vtc__ZN3ccc8FF2x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names638,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y14  : virtual ::ccc::EE2x9 {
  virtual void  pqr(); // _ZN3ccc8FF2x9y143pqrEv
  ~FF2x9y14(); // tgen
  FF2x9y14(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x9y143pqrEv");}
ccc::FF2x9y14 ::~FF2x9y14(){ note_dtor("_ZN3ccc8FF2x9y14E", this);} // tgen
ccc::FF2x9y14 ::FF2x9y14(){ note_ctor("_ZN3ccc8FF2x9y14E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y14E, buf);
    ::ccc::FF2x9y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y14E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y14E);
    dp->::ccc::FF2x9y14::~FF2x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y14E(Test__ZN3ccc8FF2x9y14E, "_ZN3ccc8FF2x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y14C1Ev();
extern void _ZN3ccc8FF2x9y14D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y14E[] = {
  NSPAIR(_ZN3ccc8FF2x9y14C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x9y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x9y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y14E[] = {
  {&(_ZTVN3ccc8FF2x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y14E[];
static VTBL_ENTRY alt_thunk_names639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y14E = {  "_ZN3ccc8FF2x9y14E", // class name
  bases__ZN3ccc8FF2x9y14E, 2,
  &(vtc__ZN3ccc8FF2x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names639,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x9y15  : virtual ::ccc::EE2x9 {
  ~FF2x9y15(); // tgen
  FF2x9y15(); // tgen
};
//SIG(1 _ZN3ccc8FF2x9y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2}}
}
namespace ccc { 
ccc::FF2x9y15 ::~FF2x9y15(){ note_dtor("_ZN3ccc8FF2x9y15E", this);} // tgen
ccc::FF2x9y15 ::FF2x9y15(){ note_ctor("_ZN3ccc8FF2x9y15E", this);} // tgen
}
static void Test__ZN3ccc8FF2x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x9y15E, buf);
    ::ccc::FF2x9y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x9y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y15E");
    check_base_class_offset(lv, (::ccc::EE2x9*), 0, "_ZN3ccc8FF2x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x9y15E);
    dp->::ccc::FF2x9y15::~FF2x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x9y15E(Test__ZN3ccc8FF2x9y15E, "_ZN3ccc8FF2x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x9y15C1Ev();
extern void _ZN3ccc8FF2x9y15D1Ev();
Name_Map name_map__ZN3ccc8FF2x9y15E[] = {
  NSPAIR(_ZN3ccc8FF2x9y15C1Ev),
  NSPAIR(_ZN3ccc8FF2x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc5EE2x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE2x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE2x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE2x9E[];
static Base_Class bases__ZN3ccc8FF2x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE2x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x9y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv)();
extern void _ZN3ccc5EE2x93efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv)();
extern void _ZN3ccc5EE2x93pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE2x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x9y15E[] = {
  {&(_ZTVN3ccc8FF2x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x9y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE2x9E__NS_8FF2x9y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x9y15E[];
static VTBL_ENTRY alt_thunk_names640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE2x93pqrEv,_ZTv0_n20_N3ccc5EE2x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE2x93efgEv,_ZTv0_n12_N3ccc5EE2x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE2x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x9y15E = {  "_ZN3ccc8FF2x9y15E", // class name
  bases__ZN3ccc8FF2x9y15E, 2,
  &(vtc__ZN3ccc8FF2x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x9y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x9y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x9y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x9y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names640,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y0  : virtual ::ccc::EE2x10 {
  virtual void  abc(); // _ZN3ccc8FF2x10y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y03pqrEv
  ~FF2x10y0(); // tgen
  FF2x10y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y03abcEv");}
void  ccc::FF2x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y03efgEv");}
void  ccc::FF2x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y03pqrEv");}
ccc::FF2x10y0 ::~FF2x10y0(){ note_dtor("_ZN3ccc8FF2x10y0E", this);} // tgen
ccc::FF2x10y0 ::FF2x10y0(){ note_ctor("_ZN3ccc8FF2x10y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y0E, buf);
    ::ccc::FF2x10y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y0E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y0E);
    dp->::ccc::FF2x10y0::~FF2x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y0E(Test__ZN3ccc8FF2x10y0E, "_ZN3ccc8FF2x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y0C1Ev();
extern void _ZN3ccc8FF2x10y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y0E[] = {
  NSPAIR(_ZN3ccc8FF2x10y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y0E[];
extern void _ZN3ccc8FF2x10y03efgEv();
extern void _ZN3ccc8FF2x10y03abcEv();
extern void _ZN3ccc8FF2x10y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y0E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y0E[] = {
  {&(_ZTVN3ccc8FF2x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y0E[];
static VTBL_ENTRY alt_thunk_names641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y0E = {  "_ZN3ccc8FF2x10y0E", // class name
  bases__ZN3ccc8FF2x10y0E, 2,
  &(vtc__ZN3ccc8FF2x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names641,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y1  : virtual ::ccc::EE2x10 {
  virtual void  abc(); // _ZN3ccc8FF2x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x10y13efgEv
  ~FF2x10y1(); // tgen
  FF2x10y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y13abcEv");}
void  ccc::FF2x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y13pqrEv");}
void  ccc::FF2x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y13efgEv");}
ccc::FF2x10y1 ::~FF2x10y1(){ note_dtor("_ZN3ccc8FF2x10y1E", this);} // tgen
ccc::FF2x10y1 ::FF2x10y1(){ note_ctor("_ZN3ccc8FF2x10y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y1E, buf);
    ::ccc::FF2x10y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y1E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y1E);
    dp->::ccc::FF2x10y1::~FF2x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y1E(Test__ZN3ccc8FF2x10y1E, "_ZN3ccc8FF2x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y1C1Ev();
extern void _ZN3ccc8FF2x10y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y1E[] = {
  NSPAIR(_ZN3ccc8FF2x10y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y1E[];
extern void _ZN3ccc8FF2x10y13efgEv();
extern void _ZN3ccc8FF2x10y13abcEv();
extern void _ZN3ccc8FF2x10y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y1E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y1E[] = {
  {&(_ZTVN3ccc8FF2x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y1E[];
static VTBL_ENTRY alt_thunk_names642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y1E = {  "_ZN3ccc8FF2x10y1E", // class name
  bases__ZN3ccc8FF2x10y1E, 2,
  &(vtc__ZN3ccc8FF2x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names642,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y2  : virtual ::ccc::EE2x10 {
  virtual void  efg(); // _ZN3ccc8FF2x10y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y23pqrEv
  ~FF2x10y2(); // tgen
  FF2x10y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y23efgEv");}
void  ccc::FF2x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y23abcEv");}
void  ccc::FF2x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y23pqrEv");}
ccc::FF2x10y2 ::~FF2x10y2(){ note_dtor("_ZN3ccc8FF2x10y2E", this);} // tgen
ccc::FF2x10y2 ::FF2x10y2(){ note_ctor("_ZN3ccc8FF2x10y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y2E, buf);
    ::ccc::FF2x10y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y2E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y2E);
    dp->::ccc::FF2x10y2::~FF2x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y2E(Test__ZN3ccc8FF2x10y2E, "_ZN3ccc8FF2x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y2C1Ev();
extern void _ZN3ccc8FF2x10y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y2E[] = {
  NSPAIR(_ZN3ccc8FF2x10y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y2E[];
extern void _ZN3ccc8FF2x10y23efgEv();
extern void _ZN3ccc8FF2x10y23abcEv();
extern void _ZN3ccc8FF2x10y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y2E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y2E[] = {
  {&(_ZTVN3ccc8FF2x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y2E[];
static VTBL_ENTRY alt_thunk_names643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y2E = {  "_ZN3ccc8FF2x10y2E", // class name
  bases__ZN3ccc8FF2x10y2E, 2,
  &(vtc__ZN3ccc8FF2x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names643,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y3  : virtual ::ccc::EE2x10 {
  virtual void  efg(); // _ZN3ccc8FF2x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x10y33abcEv
  ~FF2x10y3(); // tgen
  FF2x10y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y33efgEv");}
void  ccc::FF2x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y33pqrEv");}
void  ccc::FF2x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y33abcEv");}
ccc::FF2x10y3 ::~FF2x10y3(){ note_dtor("_ZN3ccc8FF2x10y3E", this);} // tgen
ccc::FF2x10y3 ::FF2x10y3(){ note_ctor("_ZN3ccc8FF2x10y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y3E, buf);
    ::ccc::FF2x10y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y3E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y3E);
    dp->::ccc::FF2x10y3::~FF2x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y3E(Test__ZN3ccc8FF2x10y3E, "_ZN3ccc8FF2x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y3C1Ev();
extern void _ZN3ccc8FF2x10y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y3E[] = {
  NSPAIR(_ZN3ccc8FF2x10y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y3E[];
extern void _ZN3ccc8FF2x10y33efgEv();
extern void _ZN3ccc8FF2x10y33abcEv();
extern void _ZN3ccc8FF2x10y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y3E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y3E[] = {
  {&(_ZTVN3ccc8FF2x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y3E[];
static VTBL_ENTRY alt_thunk_names644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y3E = {  "_ZN3ccc8FF2x10y3E", // class name
  bases__ZN3ccc8FF2x10y3E, 2,
  &(vtc__ZN3ccc8FF2x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names644,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y4  : virtual ::ccc::EE2x10 {
  virtual void  pqr(); // _ZN3ccc8FF2x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x10y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x10y43efgEv
  ~FF2x10y4(); // tgen
  FF2x10y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y43pqrEv");}
void  ccc::FF2x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y43abcEv");}
void  ccc::FF2x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y43efgEv");}
ccc::FF2x10y4 ::~FF2x10y4(){ note_dtor("_ZN3ccc8FF2x10y4E", this);} // tgen
ccc::FF2x10y4 ::FF2x10y4(){ note_ctor("_ZN3ccc8FF2x10y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y4E, buf);
    ::ccc::FF2x10y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y4E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y4E);
    dp->::ccc::FF2x10y4::~FF2x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y4E(Test__ZN3ccc8FF2x10y4E, "_ZN3ccc8FF2x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y4C1Ev();
extern void _ZN3ccc8FF2x10y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y4E[] = {
  NSPAIR(_ZN3ccc8FF2x10y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y4E[];
extern void _ZN3ccc8FF2x10y43efgEv();
extern void _ZN3ccc8FF2x10y43abcEv();
extern void _ZN3ccc8FF2x10y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y4E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y4E[] = {
  {&(_ZTVN3ccc8FF2x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y4E[];
static VTBL_ENTRY alt_thunk_names645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y4E = {  "_ZN3ccc8FF2x10y4E", // class name
  bases__ZN3ccc8FF2x10y4E, 2,
  &(vtc__ZN3ccc8FF2x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names645,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y5  : virtual ::ccc::EE2x10 {
  virtual void  pqr(); // _ZN3ccc8FF2x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x10y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x10y53abcEv
  ~FF2x10y5(); // tgen
  FF2x10y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y53pqrEv");}
void  ccc::FF2x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y53efgEv");}
void  ccc::FF2x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y53abcEv");}
ccc::FF2x10y5 ::~FF2x10y5(){ note_dtor("_ZN3ccc8FF2x10y5E", this);} // tgen
ccc::FF2x10y5 ::FF2x10y5(){ note_ctor("_ZN3ccc8FF2x10y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y5E, buf);
    ::ccc::FF2x10y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y5E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y5E);
    dp->::ccc::FF2x10y5::~FF2x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y5E(Test__ZN3ccc8FF2x10y5E, "_ZN3ccc8FF2x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y5C1Ev();
extern void _ZN3ccc8FF2x10y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y5E[] = {
  NSPAIR(_ZN3ccc8FF2x10y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y5E[];
extern void _ZN3ccc8FF2x10y53efgEv();
extern void _ZN3ccc8FF2x10y53abcEv();
extern void _ZN3ccc8FF2x10y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y5E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y5E[] = {
  {&(_ZTVN3ccc8FF2x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y5E[];
static VTBL_ENTRY alt_thunk_names646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y5E = {  "_ZN3ccc8FF2x10y5E", // class name
  bases__ZN3ccc8FF2x10y5E, 2,
  &(vtc__ZN3ccc8FF2x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names646,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y6  : virtual ::ccc::EE2x10 {
  virtual void  abc(); // _ZN3ccc8FF2x10y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x10y63efgEv
  ~FF2x10y6(); // tgen
  FF2x10y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y63abcEv");}
void  ccc::FF2x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y63efgEv");}
ccc::FF2x10y6 ::~FF2x10y6(){ note_dtor("_ZN3ccc8FF2x10y6E", this);} // tgen
ccc::FF2x10y6 ::FF2x10y6(){ note_ctor("_ZN3ccc8FF2x10y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y6E, buf);
    ::ccc::FF2x10y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y6E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y6E);
    dp->::ccc::FF2x10y6::~FF2x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y6E(Test__ZN3ccc8FF2x10y6E, "_ZN3ccc8FF2x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y6C1Ev();
extern void _ZN3ccc8FF2x10y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y6E[] = {
  NSPAIR(_ZN3ccc8FF2x10y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y6E[];
extern void _ZN3ccc8FF2x10y63efgEv();
extern void _ZN3ccc8FF2x10y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y6E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y6E[] = {
  {&(_ZTVN3ccc8FF2x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y6E[];
static VTBL_ENTRY alt_thunk_names647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y6E = {  "_ZN3ccc8FF2x10y6E", // class name
  bases__ZN3ccc8FF2x10y6E, 2,
  &(vtc__ZN3ccc8FF2x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names647,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y7  : virtual ::ccc::EE2x10 {
  virtual void  abc(); // _ZN3ccc8FF2x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y73pqrEv
  ~FF2x10y7(); // tgen
  FF2x10y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y73abcEv");}
void  ccc::FF2x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y73pqrEv");}
ccc::FF2x10y7 ::~FF2x10y7(){ note_dtor("_ZN3ccc8FF2x10y7E", this);} // tgen
ccc::FF2x10y7 ::FF2x10y7(){ note_ctor("_ZN3ccc8FF2x10y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y7E, buf);
    ::ccc::FF2x10y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y7E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y7E);
    dp->::ccc::FF2x10y7::~FF2x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y7E(Test__ZN3ccc8FF2x10y7E, "_ZN3ccc8FF2x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y7C1Ev();
extern void _ZN3ccc8FF2x10y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y7E[] = {
  NSPAIR(_ZN3ccc8FF2x10y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x10y73abcEv();
extern void _ZN3ccc8FF2x10y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y7E[] = {
  {&(_ZTVN3ccc8FF2x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y7E[];
static VTBL_ENTRY alt_thunk_names648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y7E = {  "_ZN3ccc8FF2x10y7E", // class name
  bases__ZN3ccc8FF2x10y7E, 2,
  &(vtc__ZN3ccc8FF2x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names648,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y8  : virtual ::ccc::EE2x10 {
  virtual void  efg(); // _ZN3ccc8FF2x10y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x10y83abcEv
  ~FF2x10y8(); // tgen
  FF2x10y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y83efgEv");}
void  ccc::FF2x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x10y83abcEv");}
ccc::FF2x10y8 ::~FF2x10y8(){ note_dtor("_ZN3ccc8FF2x10y8E", this);} // tgen
ccc::FF2x10y8 ::FF2x10y8(){ note_ctor("_ZN3ccc8FF2x10y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y8E, buf);
    ::ccc::FF2x10y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y8E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y8E);
    dp->::ccc::FF2x10y8::~FF2x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y8E(Test__ZN3ccc8FF2x10y8E, "_ZN3ccc8FF2x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y8C1Ev();
extern void _ZN3ccc8FF2x10y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y8E[] = {
  NSPAIR(_ZN3ccc8FF2x10y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y8E[];
extern void _ZN3ccc8FF2x10y83efgEv();
extern void _ZN3ccc8FF2x10y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y8E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y8E[] = {
  {&(_ZTVN3ccc8FF2x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y8E[];
static VTBL_ENTRY alt_thunk_names649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y8E = {  "_ZN3ccc8FF2x10y8E", // class name
  bases__ZN3ccc8FF2x10y8E, 2,
  &(vtc__ZN3ccc8FF2x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names649,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y9  : virtual ::ccc::EE2x10 {
  virtual void  efg(); // _ZN3ccc8FF2x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x10y93pqrEv
  ~FF2x10y9(); // tgen
  FF2x10y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x10y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x10y93efgEv");}
void  ccc::FF2x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x10y93pqrEv");}
ccc::FF2x10y9 ::~FF2x10y9(){ note_dtor("_ZN3ccc8FF2x10y9E", this);} // tgen
ccc::FF2x10y9 ::FF2x10y9(){ note_ctor("_ZN3ccc8FF2x10y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x10y9E, buf);
    ::ccc::FF2x10y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x10y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y9E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc8FF2x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x10y9E);
    dp->::ccc::FF2x10y9::~FF2x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x10y9E(Test__ZN3ccc8FF2x10y9E, "_ZN3ccc8FF2x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x10y9C1Ev();
extern void _ZN3ccc8FF2x10y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x10y9E[] = {
  NSPAIR(_ZN3ccc8FF2x10y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc8FF2x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y9E[];
extern void _ZN3ccc8FF2x10y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x10y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x10y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x10y9E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x10y9E[] = {
  {&(_ZTVN3ccc8FF2x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x10y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_8FF2x10y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x10y9E[];
static VTBL_ENTRY alt_thunk_names650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x10y9E = {  "_ZN3ccc8FF2x10y9E", // class name
  bases__ZN3ccc8FF2x10y9E, 2,
  &(vtc__ZN3ccc8FF2x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x10y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x10y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x10y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x10y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names650,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y10  : virtual ::ccc::EE2x10 {
  virtual void  pqr(); // _ZN3ccc9FF2x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x10y103abcEv
  ~FF2x10y10(); // tgen
  FF2x10y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x10y103pqrEv");}
void  ccc::FF2x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x10y103abcEv");}
ccc::FF2x10y10 ::~FF2x10y10(){ note_dtor("_ZN3ccc9FF2x10y10E", this);} // tgen
ccc::FF2x10y10 ::FF2x10y10(){ note_ctor("_ZN3ccc9FF2x10y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y10E, buf);
    ::ccc::FF2x10y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y10E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y10E);
    dp->::ccc::FF2x10y10::~FF2x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y10E(Test__ZN3ccc9FF2x10y10E, "_ZN3ccc9FF2x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y10C1Ev();
extern void _ZN3ccc9FF2x10y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y10E[] = {
  NSPAIR(_ZN3ccc9FF2x10y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x10y103abcEv();
extern void _ZN3ccc9FF2x10y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y10E[] = {
  {&(_ZTVN3ccc9FF2x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y10E[];
static VTBL_ENTRY alt_thunk_names651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y10E = {  "_ZN3ccc9FF2x10y10E", // class name
  bases__ZN3ccc9FF2x10y10E, 2,
  &(vtc__ZN3ccc9FF2x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names651,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y11  : virtual ::ccc::EE2x10 {
  virtual void  pqr(); // _ZN3ccc9FF2x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x10y113efgEv
  ~FF2x10y11(); // tgen
  FF2x10y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x10y113pqrEv");}
void  ccc::FF2x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x10y113efgEv");}
ccc::FF2x10y11 ::~FF2x10y11(){ note_dtor("_ZN3ccc9FF2x10y11E", this);} // tgen
ccc::FF2x10y11 ::FF2x10y11(){ note_ctor("_ZN3ccc9FF2x10y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y11E, buf);
    ::ccc::FF2x10y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y11E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y11E);
    dp->::ccc::FF2x10y11::~FF2x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y11E(Test__ZN3ccc9FF2x10y11E, "_ZN3ccc9FF2x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y11C1Ev();
extern void _ZN3ccc9FF2x10y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y11E[] = {
  NSPAIR(_ZN3ccc9FF2x10y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y11E[];
extern void _ZN3ccc9FF2x10y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF2x10y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y11E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y11E[] = {
  {&(_ZTVN3ccc9FF2x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y11E[];
static VTBL_ENTRY alt_thunk_names652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y11E = {  "_ZN3ccc9FF2x10y11E", // class name
  bases__ZN3ccc9FF2x10y11E, 2,
  &(vtc__ZN3ccc9FF2x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names652,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y12  : virtual ::ccc::EE2x10 {
  virtual void  abc(); // _ZN3ccc9FF2x10y123abcEv
  ~FF2x10y12(); // tgen
  FF2x10y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x10y123abcEv");}
ccc::FF2x10y12 ::~FF2x10y12(){ note_dtor("_ZN3ccc9FF2x10y12E", this);} // tgen
ccc::FF2x10y12 ::FF2x10y12(){ note_ctor("_ZN3ccc9FF2x10y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y12E, buf);
    ::ccc::FF2x10y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y12E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y12E);
    dp->::ccc::FF2x10y12::~FF2x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y12E(Test__ZN3ccc9FF2x10y12E, "_ZN3ccc9FF2x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y12C1Ev();
extern void _ZN3ccc9FF2x10y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y12E[] = {
  NSPAIR(_ZN3ccc9FF2x10y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x10y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y12E[] = {
  {&(_ZTVN3ccc9FF2x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y12E[];
static VTBL_ENTRY alt_thunk_names653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y12E = {  "_ZN3ccc9FF2x10y12E", // class name
  bases__ZN3ccc9FF2x10y12E, 2,
  &(vtc__ZN3ccc9FF2x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names653,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y13  : virtual ::ccc::EE2x10 {
  virtual void  efg(); // _ZN3ccc9FF2x10y133efgEv
  ~FF2x10y13(); // tgen
  FF2x10y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x10y133efgEv");}
ccc::FF2x10y13 ::~FF2x10y13(){ note_dtor("_ZN3ccc9FF2x10y13E", this);} // tgen
ccc::FF2x10y13 ::FF2x10y13(){ note_ctor("_ZN3ccc9FF2x10y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y13E, buf);
    ::ccc::FF2x10y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y13E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y13E);
    dp->::ccc::FF2x10y13::~FF2x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y13E(Test__ZN3ccc9FF2x10y13E, "_ZN3ccc9FF2x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y13C1Ev();
extern void _ZN3ccc9FF2x10y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y13E[] = {
  NSPAIR(_ZN3ccc9FF2x10y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y13E[];
extern void _ZN3ccc9FF2x10y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y13E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y13E[] = {
  {&(_ZTVN3ccc9FF2x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y13E[];
static VTBL_ENTRY alt_thunk_names654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y13E = {  "_ZN3ccc9FF2x10y13E", // class name
  bases__ZN3ccc9FF2x10y13E, 2,
  &(vtc__ZN3ccc9FF2x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names654,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y14  : virtual ::ccc::EE2x10 {
  virtual void  pqr(); // _ZN3ccc9FF2x10y143pqrEv
  ~FF2x10y14(); // tgen
  FF2x10y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x10y143pqrEv");}
ccc::FF2x10y14 ::~FF2x10y14(){ note_dtor("_ZN3ccc9FF2x10y14E", this);} // tgen
ccc::FF2x10y14 ::FF2x10y14(){ note_ctor("_ZN3ccc9FF2x10y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y14E, buf);
    ::ccc::FF2x10y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y14E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y14E);
    dp->::ccc::FF2x10y14::~FF2x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y14E(Test__ZN3ccc9FF2x10y14E, "_ZN3ccc9FF2x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y14C1Ev();
extern void _ZN3ccc9FF2x10y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y14E[] = {
  NSPAIR(_ZN3ccc9FF2x10y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF2x10y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x10y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y14E[] = {
  {&(_ZTVN3ccc9FF2x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y14E[];
static VTBL_ENTRY alt_thunk_names655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y14E = {  "_ZN3ccc9FF2x10y14E", // class name
  bases__ZN3ccc9FF2x10y14E, 2,
  &(vtc__ZN3ccc9FF2x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names655,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x10y15  : virtual ::ccc::EE2x10 {
  ~FF2x10y15(); // tgen
  FF2x10y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x10y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2}}
}
namespace ccc { 
ccc::FF2x10y15 ::~FF2x10y15(){ note_dtor("_ZN3ccc9FF2x10y15E", this);} // tgen
ccc::FF2x10y15 ::FF2x10y15(){ note_ctor("_ZN3ccc9FF2x10y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x10y15E, buf);
    ::ccc::FF2x10y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x10y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y15E");
    check_base_class_offset(lv, (::ccc::EE2x10*), 0, "_ZN3ccc9FF2x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x10y15E);
    dp->::ccc::FF2x10y15::~FF2x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x10y15E(Test__ZN3ccc9FF2x10y15E, "_ZN3ccc9FF2x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x10y15C1Ev();
extern void _ZN3ccc9FF2x10y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x10y15E[] = {
  NSPAIR(_ZN3ccc9FF2x10y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x10E[];
static Base_Class bases__ZN3ccc9FF2x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x10y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv)();
extern void _ZN3ccc6EE2x103abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv)();
extern void _ZN3ccc6EE2x103pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x10y15E[] = {
  {&(_ZTVN3ccc9FF2x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x10y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x10E__NS_9FF2x10y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x10y15E[];
static VTBL_ENTRY alt_thunk_names656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x103pqrEv,_ZTv0_n20_N3ccc6EE2x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x103abcEv,_ZTv0_n16_N3ccc6EE2x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x10y15E = {  "_ZN3ccc9FF2x10y15E", // class name
  bases__ZN3ccc9FF2x10y15E, 2,
  &(vtc__ZN3ccc9FF2x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x10y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x10y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x10y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x10y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names656,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y0  : virtual ::ccc::EE2x11 {
  virtual void  abc(); // _ZN3ccc8FF2x11y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y03pqrEv
  ~FF2x11y0(); // tgen
  FF2x11y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y03abcEv");}
void  ccc::FF2x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y03efgEv");}
void  ccc::FF2x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y03pqrEv");}
ccc::FF2x11y0 ::~FF2x11y0(){ note_dtor("_ZN3ccc8FF2x11y0E", this);} // tgen
ccc::FF2x11y0 ::FF2x11y0(){ note_ctor("_ZN3ccc8FF2x11y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y0E, buf);
    ::ccc::FF2x11y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y0E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y0E);
    dp->::ccc::FF2x11y0::~FF2x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y0E(Test__ZN3ccc8FF2x11y0E, "_ZN3ccc8FF2x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y0C1Ev();
extern void _ZN3ccc8FF2x11y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y0E[] = {
  NSPAIR(_ZN3ccc8FF2x11y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y0E[];
extern void _ZN3ccc8FF2x11y03efgEv();
extern void _ZN3ccc8FF2x11y03abcEv();
extern void _ZN3ccc8FF2x11y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y0E[] = {
  {&(_ZTVN3ccc8FF2x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y0E[];
static VTBL_ENTRY alt_thunk_names657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y0E = {  "_ZN3ccc8FF2x11y0E", // class name
  bases__ZN3ccc8FF2x11y0E, 2,
  &(vtc__ZN3ccc8FF2x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names657,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y1  : virtual ::ccc::EE2x11 {
  virtual void  abc(); // _ZN3ccc8FF2x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x11y13efgEv
  ~FF2x11y1(); // tgen
  FF2x11y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y13abcEv");}
void  ccc::FF2x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y13pqrEv");}
void  ccc::FF2x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y13efgEv");}
ccc::FF2x11y1 ::~FF2x11y1(){ note_dtor("_ZN3ccc8FF2x11y1E", this);} // tgen
ccc::FF2x11y1 ::FF2x11y1(){ note_ctor("_ZN3ccc8FF2x11y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y1E, buf);
    ::ccc::FF2x11y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y1E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y1E);
    dp->::ccc::FF2x11y1::~FF2x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y1E(Test__ZN3ccc8FF2x11y1E, "_ZN3ccc8FF2x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y1C1Ev();
extern void _ZN3ccc8FF2x11y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y1E[] = {
  NSPAIR(_ZN3ccc8FF2x11y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y1E[];
extern void _ZN3ccc8FF2x11y13efgEv();
extern void _ZN3ccc8FF2x11y13abcEv();
extern void _ZN3ccc8FF2x11y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y1E[] = {
  {&(_ZTVN3ccc8FF2x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y1E[];
static VTBL_ENTRY alt_thunk_names658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y1E = {  "_ZN3ccc8FF2x11y1E", // class name
  bases__ZN3ccc8FF2x11y1E, 2,
  &(vtc__ZN3ccc8FF2x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names658,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y2  : virtual ::ccc::EE2x11 {
  virtual void  efg(); // _ZN3ccc8FF2x11y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y23pqrEv
  ~FF2x11y2(); // tgen
  FF2x11y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y23efgEv");}
void  ccc::FF2x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y23abcEv");}
void  ccc::FF2x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y23pqrEv");}
ccc::FF2x11y2 ::~FF2x11y2(){ note_dtor("_ZN3ccc8FF2x11y2E", this);} // tgen
ccc::FF2x11y2 ::FF2x11y2(){ note_ctor("_ZN3ccc8FF2x11y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y2E, buf);
    ::ccc::FF2x11y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y2E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y2E);
    dp->::ccc::FF2x11y2::~FF2x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y2E(Test__ZN3ccc8FF2x11y2E, "_ZN3ccc8FF2x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y2C1Ev();
extern void _ZN3ccc8FF2x11y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y2E[] = {
  NSPAIR(_ZN3ccc8FF2x11y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y2E[];
extern void _ZN3ccc8FF2x11y23efgEv();
extern void _ZN3ccc8FF2x11y23abcEv();
extern void _ZN3ccc8FF2x11y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y2E[] = {
  {&(_ZTVN3ccc8FF2x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y2E[];
static VTBL_ENTRY alt_thunk_names659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y2E = {  "_ZN3ccc8FF2x11y2E", // class name
  bases__ZN3ccc8FF2x11y2E, 2,
  &(vtc__ZN3ccc8FF2x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names659,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y3  : virtual ::ccc::EE2x11 {
  virtual void  efg(); // _ZN3ccc8FF2x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x11y33abcEv
  ~FF2x11y3(); // tgen
  FF2x11y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y33efgEv");}
void  ccc::FF2x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y33pqrEv");}
void  ccc::FF2x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y33abcEv");}
ccc::FF2x11y3 ::~FF2x11y3(){ note_dtor("_ZN3ccc8FF2x11y3E", this);} // tgen
ccc::FF2x11y3 ::FF2x11y3(){ note_ctor("_ZN3ccc8FF2x11y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y3E, buf);
    ::ccc::FF2x11y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y3E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y3E);
    dp->::ccc::FF2x11y3::~FF2x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y3E(Test__ZN3ccc8FF2x11y3E, "_ZN3ccc8FF2x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y3C1Ev();
extern void _ZN3ccc8FF2x11y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y3E[] = {
  NSPAIR(_ZN3ccc8FF2x11y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y3E[];
extern void _ZN3ccc8FF2x11y33efgEv();
extern void _ZN3ccc8FF2x11y33abcEv();
extern void _ZN3ccc8FF2x11y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y3E[] = {
  {&(_ZTVN3ccc8FF2x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y3E[];
static VTBL_ENTRY alt_thunk_names660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y3E = {  "_ZN3ccc8FF2x11y3E", // class name
  bases__ZN3ccc8FF2x11y3E, 2,
  &(vtc__ZN3ccc8FF2x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names660,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y4  : virtual ::ccc::EE2x11 {
  virtual void  pqr(); // _ZN3ccc8FF2x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x11y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x11y43efgEv
  ~FF2x11y4(); // tgen
  FF2x11y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y43pqrEv");}
void  ccc::FF2x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y43abcEv");}
void  ccc::FF2x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y43efgEv");}
ccc::FF2x11y4 ::~FF2x11y4(){ note_dtor("_ZN3ccc8FF2x11y4E", this);} // tgen
ccc::FF2x11y4 ::FF2x11y4(){ note_ctor("_ZN3ccc8FF2x11y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y4E, buf);
    ::ccc::FF2x11y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y4E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y4E);
    dp->::ccc::FF2x11y4::~FF2x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y4E(Test__ZN3ccc8FF2x11y4E, "_ZN3ccc8FF2x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y4C1Ev();
extern void _ZN3ccc8FF2x11y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y4E[] = {
  NSPAIR(_ZN3ccc8FF2x11y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y4E[];
extern void _ZN3ccc8FF2x11y43efgEv();
extern void _ZN3ccc8FF2x11y43abcEv();
extern void _ZN3ccc8FF2x11y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y4E[] = {
  {&(_ZTVN3ccc8FF2x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y4E[];
static VTBL_ENTRY alt_thunk_names661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y4E = {  "_ZN3ccc8FF2x11y4E", // class name
  bases__ZN3ccc8FF2x11y4E, 2,
  &(vtc__ZN3ccc8FF2x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names661,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y5  : virtual ::ccc::EE2x11 {
  virtual void  pqr(); // _ZN3ccc8FF2x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x11y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x11y53abcEv
  ~FF2x11y5(); // tgen
  FF2x11y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y53pqrEv");}
void  ccc::FF2x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y53efgEv");}
void  ccc::FF2x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y53abcEv");}
ccc::FF2x11y5 ::~FF2x11y5(){ note_dtor("_ZN3ccc8FF2x11y5E", this);} // tgen
ccc::FF2x11y5 ::FF2x11y5(){ note_ctor("_ZN3ccc8FF2x11y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y5E, buf);
    ::ccc::FF2x11y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y5E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y5E);
    dp->::ccc::FF2x11y5::~FF2x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y5E(Test__ZN3ccc8FF2x11y5E, "_ZN3ccc8FF2x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y5C1Ev();
extern void _ZN3ccc8FF2x11y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y5E[] = {
  NSPAIR(_ZN3ccc8FF2x11y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y5E[];
extern void _ZN3ccc8FF2x11y53efgEv();
extern void _ZN3ccc8FF2x11y53abcEv();
extern void _ZN3ccc8FF2x11y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y5E[] = {
  {&(_ZTVN3ccc8FF2x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y5E[];
static VTBL_ENTRY alt_thunk_names662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y5E = {  "_ZN3ccc8FF2x11y5E", // class name
  bases__ZN3ccc8FF2x11y5E, 2,
  &(vtc__ZN3ccc8FF2x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names662,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y6  : virtual ::ccc::EE2x11 {
  virtual void  abc(); // _ZN3ccc8FF2x11y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x11y63efgEv
  ~FF2x11y6(); // tgen
  FF2x11y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y63abcEv");}
void  ccc::FF2x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y63efgEv");}
ccc::FF2x11y6 ::~FF2x11y6(){ note_dtor("_ZN3ccc8FF2x11y6E", this);} // tgen
ccc::FF2x11y6 ::FF2x11y6(){ note_ctor("_ZN3ccc8FF2x11y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y6E, buf);
    ::ccc::FF2x11y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y6E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y6E);
    dp->::ccc::FF2x11y6::~FF2x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y6E(Test__ZN3ccc8FF2x11y6E, "_ZN3ccc8FF2x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y6C1Ev();
extern void _ZN3ccc8FF2x11y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y6E[] = {
  NSPAIR(_ZN3ccc8FF2x11y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y6E[];
extern void _ZN3ccc8FF2x11y63efgEv();
extern void _ZN3ccc8FF2x11y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y6E[] = {
  {&(_ZTVN3ccc8FF2x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y6E[];
static VTBL_ENTRY alt_thunk_names663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y6E = {  "_ZN3ccc8FF2x11y6E", // class name
  bases__ZN3ccc8FF2x11y6E, 2,
  &(vtc__ZN3ccc8FF2x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names663,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y7  : virtual ::ccc::EE2x11 {
  virtual void  abc(); // _ZN3ccc8FF2x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y73pqrEv
  ~FF2x11y7(); // tgen
  FF2x11y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y73abcEv");}
void  ccc::FF2x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y73pqrEv");}
ccc::FF2x11y7 ::~FF2x11y7(){ note_dtor("_ZN3ccc8FF2x11y7E", this);} // tgen
ccc::FF2x11y7 ::FF2x11y7(){ note_ctor("_ZN3ccc8FF2x11y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y7E, buf);
    ::ccc::FF2x11y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y7E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y7E);
    dp->::ccc::FF2x11y7::~FF2x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y7E(Test__ZN3ccc8FF2x11y7E, "_ZN3ccc8FF2x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y7C1Ev();
extern void _ZN3ccc8FF2x11y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y7E[] = {
  NSPAIR(_ZN3ccc8FF2x11y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x11y73abcEv();
extern void _ZN3ccc8FF2x11y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y7E[] = {
  {&(_ZTVN3ccc8FF2x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y7E[];
static VTBL_ENTRY alt_thunk_names664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y7E = {  "_ZN3ccc8FF2x11y7E", // class name
  bases__ZN3ccc8FF2x11y7E, 2,
  &(vtc__ZN3ccc8FF2x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names664,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y8  : virtual ::ccc::EE2x11 {
  virtual void  efg(); // _ZN3ccc8FF2x11y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x11y83abcEv
  ~FF2x11y8(); // tgen
  FF2x11y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y83efgEv");}
void  ccc::FF2x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x11y83abcEv");}
ccc::FF2x11y8 ::~FF2x11y8(){ note_dtor("_ZN3ccc8FF2x11y8E", this);} // tgen
ccc::FF2x11y8 ::FF2x11y8(){ note_ctor("_ZN3ccc8FF2x11y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y8E, buf);
    ::ccc::FF2x11y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y8E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y8E);
    dp->::ccc::FF2x11y8::~FF2x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y8E(Test__ZN3ccc8FF2x11y8E, "_ZN3ccc8FF2x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y8C1Ev();
extern void _ZN3ccc8FF2x11y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y8E[] = {
  NSPAIR(_ZN3ccc8FF2x11y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y8E[];
extern void _ZN3ccc8FF2x11y83efgEv();
extern void _ZN3ccc8FF2x11y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y8E[] = {
  {&(_ZTVN3ccc8FF2x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y8E[];
static VTBL_ENTRY alt_thunk_names665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y8E = {  "_ZN3ccc8FF2x11y8E", // class name
  bases__ZN3ccc8FF2x11y8E, 2,
  &(vtc__ZN3ccc8FF2x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names665,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y9  : virtual ::ccc::EE2x11 {
  virtual void  efg(); // _ZN3ccc8FF2x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x11y93pqrEv
  ~FF2x11y9(); // tgen
  FF2x11y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x11y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x11y93efgEv");}
void  ccc::FF2x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x11y93pqrEv");}
ccc::FF2x11y9 ::~FF2x11y9(){ note_dtor("_ZN3ccc8FF2x11y9E", this);} // tgen
ccc::FF2x11y9 ::FF2x11y9(){ note_ctor("_ZN3ccc8FF2x11y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x11y9E, buf);
    ::ccc::FF2x11y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x11y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y9E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc8FF2x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x11y9E);
    dp->::ccc::FF2x11y9::~FF2x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x11y9E(Test__ZN3ccc8FF2x11y9E, "_ZN3ccc8FF2x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x11y9C1Ev();
extern void _ZN3ccc8FF2x11y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x11y9E[] = {
  NSPAIR(_ZN3ccc8FF2x11y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc8FF2x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y9E[];
extern void _ZN3ccc8FF2x11y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x11y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x11y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x11y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x11y9E[] = {
  {&(_ZTVN3ccc8FF2x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x11y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_8FF2x11y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x11y9E[];
static VTBL_ENTRY alt_thunk_names666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x11y9E = {  "_ZN3ccc8FF2x11y9E", // class name
  bases__ZN3ccc8FF2x11y9E, 2,
  &(vtc__ZN3ccc8FF2x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x11y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x11y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x11y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x11y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names666,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y10  : virtual ::ccc::EE2x11 {
  virtual void  pqr(); // _ZN3ccc9FF2x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x11y103abcEv
  ~FF2x11y10(); // tgen
  FF2x11y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x11y103pqrEv");}
void  ccc::FF2x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x11y103abcEv");}
ccc::FF2x11y10 ::~FF2x11y10(){ note_dtor("_ZN3ccc9FF2x11y10E", this);} // tgen
ccc::FF2x11y10 ::FF2x11y10(){ note_ctor("_ZN3ccc9FF2x11y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y10E, buf);
    ::ccc::FF2x11y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y10E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y10E);
    dp->::ccc::FF2x11y10::~FF2x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y10E(Test__ZN3ccc9FF2x11y10E, "_ZN3ccc9FF2x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y10C1Ev();
extern void _ZN3ccc9FF2x11y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y10E[] = {
  NSPAIR(_ZN3ccc9FF2x11y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF2x11y103abcEv();
extern void _ZN3ccc9FF2x11y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y10E[] = {
  {&(_ZTVN3ccc9FF2x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y10E[];
static VTBL_ENTRY alt_thunk_names667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y10E = {  "_ZN3ccc9FF2x11y10E", // class name
  bases__ZN3ccc9FF2x11y10E, 2,
  &(vtc__ZN3ccc9FF2x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names667,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y11  : virtual ::ccc::EE2x11 {
  virtual void  pqr(); // _ZN3ccc9FF2x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x11y113efgEv
  ~FF2x11y11(); // tgen
  FF2x11y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x11y113pqrEv");}
void  ccc::FF2x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x11y113efgEv");}
ccc::FF2x11y11 ::~FF2x11y11(){ note_dtor("_ZN3ccc9FF2x11y11E", this);} // tgen
ccc::FF2x11y11 ::FF2x11y11(){ note_ctor("_ZN3ccc9FF2x11y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y11E, buf);
    ::ccc::FF2x11y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y11E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y11E);
    dp->::ccc::FF2x11y11::~FF2x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y11E(Test__ZN3ccc9FF2x11y11E, "_ZN3ccc9FF2x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y11C1Ev();
extern void _ZN3ccc9FF2x11y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y11E[] = {
  NSPAIR(_ZN3ccc9FF2x11y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y11E[];
extern void _ZN3ccc9FF2x11y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x11y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y11E[] = {
  {&(_ZTVN3ccc9FF2x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y11E[];
static VTBL_ENTRY alt_thunk_names668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y11E = {  "_ZN3ccc9FF2x11y11E", // class name
  bases__ZN3ccc9FF2x11y11E, 2,
  &(vtc__ZN3ccc9FF2x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names668,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y12  : virtual ::ccc::EE2x11 {
  virtual void  abc(); // _ZN3ccc9FF2x11y123abcEv
  ~FF2x11y12(); // tgen
  FF2x11y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF2x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x11y123abcEv");}
ccc::FF2x11y12 ::~FF2x11y12(){ note_dtor("_ZN3ccc9FF2x11y12E", this);} // tgen
ccc::FF2x11y12 ::FF2x11y12(){ note_ctor("_ZN3ccc9FF2x11y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y12E, buf);
    ::ccc::FF2x11y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y12E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y12E);
    dp->::ccc::FF2x11y12::~FF2x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y12E(Test__ZN3ccc9FF2x11y12E, "_ZN3ccc9FF2x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y12C1Ev();
extern void _ZN3ccc9FF2x11y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y12E[] = {
  NSPAIR(_ZN3ccc9FF2x11y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF2x11y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y12E[] = {
  {&(_ZTVN3ccc9FF2x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y12E[];
static VTBL_ENTRY alt_thunk_names669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y12E = {  "_ZN3ccc9FF2x11y12E", // class name
  bases__ZN3ccc9FF2x11y12E, 2,
  &(vtc__ZN3ccc9FF2x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names669,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y13  : virtual ::ccc::EE2x11 {
  virtual void  efg(); // _ZN3ccc9FF2x11y133efgEv
  ~FF2x11y13(); // tgen
  FF2x11y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF2x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x11y133efgEv");}
ccc::FF2x11y13 ::~FF2x11y13(){ note_dtor("_ZN3ccc9FF2x11y13E", this);} // tgen
ccc::FF2x11y13 ::FF2x11y13(){ note_ctor("_ZN3ccc9FF2x11y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y13E, buf);
    ::ccc::FF2x11y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y13E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y13E);
    dp->::ccc::FF2x11y13::~FF2x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y13E(Test__ZN3ccc9FF2x11y13E, "_ZN3ccc9FF2x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y13C1Ev();
extern void _ZN3ccc9FF2x11y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y13E[] = {
  NSPAIR(_ZN3ccc9FF2x11y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y13E[];
extern void _ZN3ccc9FF2x11y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y13E[] = {
  {&(_ZTVN3ccc9FF2x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y13E[];
static VTBL_ENTRY alt_thunk_names670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y13E = {  "_ZN3ccc9FF2x11y13E", // class name
  bases__ZN3ccc9FF2x11y13E, 2,
  &(vtc__ZN3ccc9FF2x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names670,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y14  : virtual ::ccc::EE2x11 {
  virtual void  pqr(); // _ZN3ccc9FF2x11y143pqrEv
  ~FF2x11y14(); // tgen
  FF2x11y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF2x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x11y143pqrEv");}
ccc::FF2x11y14 ::~FF2x11y14(){ note_dtor("_ZN3ccc9FF2x11y14E", this);} // tgen
ccc::FF2x11y14 ::FF2x11y14(){ note_ctor("_ZN3ccc9FF2x11y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y14E, buf);
    ::ccc::FF2x11y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y14E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y14E);
    dp->::ccc::FF2x11y14::~FF2x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y14E(Test__ZN3ccc9FF2x11y14E, "_ZN3ccc9FF2x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y14C1Ev();
extern void _ZN3ccc9FF2x11y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y14E[] = {
  NSPAIR(_ZN3ccc9FF2x11y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x11y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x11y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y14E[] = {
  {&(_ZTVN3ccc9FF2x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y14E[];
static VTBL_ENTRY alt_thunk_names671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y14E = {  "_ZN3ccc9FF2x11y14E", // class name
  bases__ZN3ccc9FF2x11y14E, 2,
  &(vtc__ZN3ccc9FF2x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names671,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x11y15  : virtual ::ccc::EE2x11 {
  ~FF2x11y15(); // tgen
  FF2x11y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x11y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2}}
}
namespace ccc { 
ccc::FF2x11y15 ::~FF2x11y15(){ note_dtor("_ZN3ccc9FF2x11y15E", this);} // tgen
ccc::FF2x11y15 ::FF2x11y15(){ note_ctor("_ZN3ccc9FF2x11y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x11y15E, buf);
    ::ccc::FF2x11y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x11y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y15E");
    check_base_class_offset(lv, (::ccc::EE2x11*), 0, "_ZN3ccc9FF2x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x11y15E);
    dp->::ccc::FF2x11y15::~FF2x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x11y15E(Test__ZN3ccc9FF2x11y15E, "_ZN3ccc9FF2x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x11y15C1Ev();
extern void _ZN3ccc9FF2x11y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x11y15E[] = {
  NSPAIR(_ZN3ccc9FF2x11y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x11E[];
static Base_Class bases__ZN3ccc9FF2x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x11y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv)();
extern void _ZN3ccc6EE2x113efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv)();
extern void _ZN3ccc6EE2x113pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x11y15E[] = {
  {&(_ZTVN3ccc9FF2x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x11y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x11E__NS_9FF2x11y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x11y15E[];
static VTBL_ENTRY alt_thunk_names672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x113pqrEv,_ZTv0_n20_N3ccc6EE2x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x113efgEv,_ZTv0_n12_N3ccc6EE2x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x11y15E = {  "_ZN3ccc9FF2x11y15E", // class name
  bases__ZN3ccc9FF2x11y15E, 2,
  &(vtc__ZN3ccc9FF2x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x11y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x11y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x11y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x11y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names672,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y0  : virtual ::ccc::EE2x12 {
  virtual void  abc(); // _ZN3ccc8FF2x12y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y03pqrEv
  ~FF2x12y0(); // tgen
  FF2x12y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y03abcEv");}
void  ccc::FF2x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y03efgEv");}
void  ccc::FF2x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y03pqrEv");}
ccc::FF2x12y0 ::~FF2x12y0(){ note_dtor("_ZN3ccc8FF2x12y0E", this);} // tgen
ccc::FF2x12y0 ::FF2x12y0(){ note_ctor("_ZN3ccc8FF2x12y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y0E, buf);
    ::ccc::FF2x12y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y0E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y0E);
    dp->::ccc::FF2x12y0::~FF2x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y0E(Test__ZN3ccc8FF2x12y0E, "_ZN3ccc8FF2x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y0C1Ev();
extern void _ZN3ccc8FF2x12y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y0E[] = {
  NSPAIR(_ZN3ccc8FF2x12y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y0E[];
extern void _ZN3ccc8FF2x12y03efgEv();
extern void _ZN3ccc8FF2x12y03abcEv();
extern void _ZN3ccc8FF2x12y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y0E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y0E[] = {
  {&(_ZTVN3ccc8FF2x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y0E[];
static VTBL_ENTRY alt_thunk_names673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y0E = {  "_ZN3ccc8FF2x12y0E", // class name
  bases__ZN3ccc8FF2x12y0E, 2,
  &(vtc__ZN3ccc8FF2x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names673,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y1  : virtual ::ccc::EE2x12 {
  virtual void  abc(); // _ZN3ccc8FF2x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x12y13efgEv
  ~FF2x12y1(); // tgen
  FF2x12y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y13abcEv");}
void  ccc::FF2x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y13pqrEv");}
void  ccc::FF2x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y13efgEv");}
ccc::FF2x12y1 ::~FF2x12y1(){ note_dtor("_ZN3ccc8FF2x12y1E", this);} // tgen
ccc::FF2x12y1 ::FF2x12y1(){ note_ctor("_ZN3ccc8FF2x12y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y1E, buf);
    ::ccc::FF2x12y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y1E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y1E);
    dp->::ccc::FF2x12y1::~FF2x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y1E(Test__ZN3ccc8FF2x12y1E, "_ZN3ccc8FF2x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y1C1Ev();
extern void _ZN3ccc8FF2x12y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y1E[] = {
  NSPAIR(_ZN3ccc8FF2x12y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y1E[];
extern void _ZN3ccc8FF2x12y13efgEv();
extern void _ZN3ccc8FF2x12y13abcEv();
extern void _ZN3ccc8FF2x12y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y1E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y1E[] = {
  {&(_ZTVN3ccc8FF2x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y1E[];
static VTBL_ENTRY alt_thunk_names674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y1E = {  "_ZN3ccc8FF2x12y1E", // class name
  bases__ZN3ccc8FF2x12y1E, 2,
  &(vtc__ZN3ccc8FF2x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names674,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y2  : virtual ::ccc::EE2x12 {
  virtual void  efg(); // _ZN3ccc8FF2x12y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y23pqrEv
  ~FF2x12y2(); // tgen
  FF2x12y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y23efgEv");}
void  ccc::FF2x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y23abcEv");}
void  ccc::FF2x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y23pqrEv");}
ccc::FF2x12y2 ::~FF2x12y2(){ note_dtor("_ZN3ccc8FF2x12y2E", this);} // tgen
ccc::FF2x12y2 ::FF2x12y2(){ note_ctor("_ZN3ccc8FF2x12y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y2E, buf);
    ::ccc::FF2x12y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y2E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y2E);
    dp->::ccc::FF2x12y2::~FF2x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y2E(Test__ZN3ccc8FF2x12y2E, "_ZN3ccc8FF2x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y2C1Ev();
extern void _ZN3ccc8FF2x12y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y2E[] = {
  NSPAIR(_ZN3ccc8FF2x12y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y2E[];
extern void _ZN3ccc8FF2x12y23efgEv();
extern void _ZN3ccc8FF2x12y23abcEv();
extern void _ZN3ccc8FF2x12y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y2E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y2E[] = {
  {&(_ZTVN3ccc8FF2x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y2E[];
static VTBL_ENTRY alt_thunk_names675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y2E = {  "_ZN3ccc8FF2x12y2E", // class name
  bases__ZN3ccc8FF2x12y2E, 2,
  &(vtc__ZN3ccc8FF2x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names675,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y3  : virtual ::ccc::EE2x12 {
  virtual void  efg(); // _ZN3ccc8FF2x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x12y33abcEv
  ~FF2x12y3(); // tgen
  FF2x12y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y33efgEv");}
void  ccc::FF2x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y33pqrEv");}
void  ccc::FF2x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y33abcEv");}
ccc::FF2x12y3 ::~FF2x12y3(){ note_dtor("_ZN3ccc8FF2x12y3E", this);} // tgen
ccc::FF2x12y3 ::FF2x12y3(){ note_ctor("_ZN3ccc8FF2x12y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y3E, buf);
    ::ccc::FF2x12y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y3E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y3E);
    dp->::ccc::FF2x12y3::~FF2x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y3E(Test__ZN3ccc8FF2x12y3E, "_ZN3ccc8FF2x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y3C1Ev();
extern void _ZN3ccc8FF2x12y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y3E[] = {
  NSPAIR(_ZN3ccc8FF2x12y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y3E[];
extern void _ZN3ccc8FF2x12y33efgEv();
extern void _ZN3ccc8FF2x12y33abcEv();
extern void _ZN3ccc8FF2x12y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y3E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y3E[] = {
  {&(_ZTVN3ccc8FF2x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y3E[];
static VTBL_ENTRY alt_thunk_names676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y3E = {  "_ZN3ccc8FF2x12y3E", // class name
  bases__ZN3ccc8FF2x12y3E, 2,
  &(vtc__ZN3ccc8FF2x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names676,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y4  : virtual ::ccc::EE2x12 {
  virtual void  pqr(); // _ZN3ccc8FF2x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x12y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x12y43efgEv
  ~FF2x12y4(); // tgen
  FF2x12y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y43pqrEv");}
void  ccc::FF2x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y43abcEv");}
void  ccc::FF2x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y43efgEv");}
ccc::FF2x12y4 ::~FF2x12y4(){ note_dtor("_ZN3ccc8FF2x12y4E", this);} // tgen
ccc::FF2x12y4 ::FF2x12y4(){ note_ctor("_ZN3ccc8FF2x12y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y4E, buf);
    ::ccc::FF2x12y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y4E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y4E);
    dp->::ccc::FF2x12y4::~FF2x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y4E(Test__ZN3ccc8FF2x12y4E, "_ZN3ccc8FF2x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y4C1Ev();
extern void _ZN3ccc8FF2x12y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y4E[] = {
  NSPAIR(_ZN3ccc8FF2x12y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y4E[];
extern void _ZN3ccc8FF2x12y43efgEv();
extern void _ZN3ccc8FF2x12y43abcEv();
extern void _ZN3ccc8FF2x12y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y4E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y4E[] = {
  {&(_ZTVN3ccc8FF2x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y4E[];
static VTBL_ENTRY alt_thunk_names677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y4E = {  "_ZN3ccc8FF2x12y4E", // class name
  bases__ZN3ccc8FF2x12y4E, 2,
  &(vtc__ZN3ccc8FF2x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names677,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y5  : virtual ::ccc::EE2x12 {
  virtual void  pqr(); // _ZN3ccc8FF2x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x12y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x12y53abcEv
  ~FF2x12y5(); // tgen
  FF2x12y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y53pqrEv");}
void  ccc::FF2x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y53efgEv");}
void  ccc::FF2x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y53abcEv");}
ccc::FF2x12y5 ::~FF2x12y5(){ note_dtor("_ZN3ccc8FF2x12y5E", this);} // tgen
ccc::FF2x12y5 ::FF2x12y5(){ note_ctor("_ZN3ccc8FF2x12y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y5E, buf);
    ::ccc::FF2x12y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y5E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y5E);
    dp->::ccc::FF2x12y5::~FF2x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y5E(Test__ZN3ccc8FF2x12y5E, "_ZN3ccc8FF2x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y5C1Ev();
extern void _ZN3ccc8FF2x12y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y5E[] = {
  NSPAIR(_ZN3ccc8FF2x12y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y5E[];
extern void _ZN3ccc8FF2x12y53efgEv();
extern void _ZN3ccc8FF2x12y53abcEv();
extern void _ZN3ccc8FF2x12y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y5E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y5E[] = {
  {&(_ZTVN3ccc8FF2x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y5E[];
static VTBL_ENTRY alt_thunk_names678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y5E = {  "_ZN3ccc8FF2x12y5E", // class name
  bases__ZN3ccc8FF2x12y5E, 2,
  &(vtc__ZN3ccc8FF2x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names678,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y6  : virtual ::ccc::EE2x12 {
  virtual void  abc(); // _ZN3ccc8FF2x12y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x12y63efgEv
  ~FF2x12y6(); // tgen
  FF2x12y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y63abcEv");}
void  ccc::FF2x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y63efgEv");}
ccc::FF2x12y6 ::~FF2x12y6(){ note_dtor("_ZN3ccc8FF2x12y6E", this);} // tgen
ccc::FF2x12y6 ::FF2x12y6(){ note_ctor("_ZN3ccc8FF2x12y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y6E, buf);
    ::ccc::FF2x12y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y6E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y6E);
    dp->::ccc::FF2x12y6::~FF2x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y6E(Test__ZN3ccc8FF2x12y6E, "_ZN3ccc8FF2x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y6C1Ev();
extern void _ZN3ccc8FF2x12y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y6E[] = {
  NSPAIR(_ZN3ccc8FF2x12y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y6E[];
extern void _ZN3ccc8FF2x12y63efgEv();
extern void _ZN3ccc8FF2x12y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y6E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y6E[] = {
  {&(_ZTVN3ccc8FF2x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y6E[];
static VTBL_ENTRY alt_thunk_names679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y6E = {  "_ZN3ccc8FF2x12y6E", // class name
  bases__ZN3ccc8FF2x12y6E, 2,
  &(vtc__ZN3ccc8FF2x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names679,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y7  : virtual ::ccc::EE2x12 {
  virtual void  abc(); // _ZN3ccc8FF2x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y73pqrEv
  ~FF2x12y7(); // tgen
  FF2x12y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y73abcEv");}
void  ccc::FF2x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y73pqrEv");}
ccc::FF2x12y7 ::~FF2x12y7(){ note_dtor("_ZN3ccc8FF2x12y7E", this);} // tgen
ccc::FF2x12y7 ::FF2x12y7(){ note_ctor("_ZN3ccc8FF2x12y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y7E, buf);
    ::ccc::FF2x12y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y7E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y7E);
    dp->::ccc::FF2x12y7::~FF2x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y7E(Test__ZN3ccc8FF2x12y7E, "_ZN3ccc8FF2x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y7C1Ev();
extern void _ZN3ccc8FF2x12y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y7E[] = {
  NSPAIR(_ZN3ccc8FF2x12y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x12y73abcEv();
extern void _ZN3ccc8FF2x12y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y7E[] = {
  {&(_ZTVN3ccc8FF2x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y7E[];
static VTBL_ENTRY alt_thunk_names680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y7E = {  "_ZN3ccc8FF2x12y7E", // class name
  bases__ZN3ccc8FF2x12y7E, 2,
  &(vtc__ZN3ccc8FF2x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names680,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y8  : virtual ::ccc::EE2x12 {
  virtual void  efg(); // _ZN3ccc8FF2x12y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x12y83abcEv
  ~FF2x12y8(); // tgen
  FF2x12y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y83efgEv");}
void  ccc::FF2x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x12y83abcEv");}
ccc::FF2x12y8 ::~FF2x12y8(){ note_dtor("_ZN3ccc8FF2x12y8E", this);} // tgen
ccc::FF2x12y8 ::FF2x12y8(){ note_ctor("_ZN3ccc8FF2x12y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y8E, buf);
    ::ccc::FF2x12y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y8E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y8E);
    dp->::ccc::FF2x12y8::~FF2x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y8E(Test__ZN3ccc8FF2x12y8E, "_ZN3ccc8FF2x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y8C1Ev();
extern void _ZN3ccc8FF2x12y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y8E[] = {
  NSPAIR(_ZN3ccc8FF2x12y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y8E[];
extern void _ZN3ccc8FF2x12y83efgEv();
extern void _ZN3ccc8FF2x12y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y8E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y8E[] = {
  {&(_ZTVN3ccc8FF2x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y8E[];
static VTBL_ENTRY alt_thunk_names681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y8E = {  "_ZN3ccc8FF2x12y8E", // class name
  bases__ZN3ccc8FF2x12y8E, 2,
  &(vtc__ZN3ccc8FF2x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names681,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y9  : virtual ::ccc::EE2x12 {
  virtual void  efg(); // _ZN3ccc8FF2x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x12y93pqrEv
  ~FF2x12y9(); // tgen
  FF2x12y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x12y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x12y93efgEv");}
void  ccc::FF2x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x12y93pqrEv");}
ccc::FF2x12y9 ::~FF2x12y9(){ note_dtor("_ZN3ccc8FF2x12y9E", this);} // tgen
ccc::FF2x12y9 ::FF2x12y9(){ note_ctor("_ZN3ccc8FF2x12y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x12y9E, buf);
    ::ccc::FF2x12y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x12y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y9E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc8FF2x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x12y9E);
    dp->::ccc::FF2x12y9::~FF2x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x12y9E(Test__ZN3ccc8FF2x12y9E, "_ZN3ccc8FF2x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x12y9C1Ev();
extern void _ZN3ccc8FF2x12y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x12y9E[] = {
  NSPAIR(_ZN3ccc8FF2x12y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc8FF2x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y9E[];
extern void _ZN3ccc8FF2x12y93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc8FF2x12y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x12y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x12y9E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x12y9E[] = {
  {&(_ZTVN3ccc8FF2x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x12y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_8FF2x12y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x12y9E[];
static VTBL_ENTRY alt_thunk_names682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x12y9E = {  "_ZN3ccc8FF2x12y9E", // class name
  bases__ZN3ccc8FF2x12y9E, 2,
  &(vtc__ZN3ccc8FF2x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x12y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x12y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x12y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x12y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names682,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y10  : virtual ::ccc::EE2x12 {
  virtual void  pqr(); // _ZN3ccc9FF2x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x12y103abcEv
  ~FF2x12y10(); // tgen
  FF2x12y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x12y103pqrEv");}
void  ccc::FF2x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x12y103abcEv");}
ccc::FF2x12y10 ::~FF2x12y10(){ note_dtor("_ZN3ccc9FF2x12y10E", this);} // tgen
ccc::FF2x12y10 ::FF2x12y10(){ note_ctor("_ZN3ccc9FF2x12y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y10E, buf);
    ::ccc::FF2x12y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y10E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y10E);
    dp->::ccc::FF2x12y10::~FF2x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y10E(Test__ZN3ccc9FF2x12y10E, "_ZN3ccc9FF2x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y10C1Ev();
extern void _ZN3ccc9FF2x12y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y10E[] = {
  NSPAIR(_ZN3ccc9FF2x12y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x12y103abcEv();
extern void _ZN3ccc9FF2x12y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y10E[] = {
  {&(_ZTVN3ccc9FF2x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y10E[];
static VTBL_ENTRY alt_thunk_names683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y10E = {  "_ZN3ccc9FF2x12y10E", // class name
  bases__ZN3ccc9FF2x12y10E, 2,
  &(vtc__ZN3ccc9FF2x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names683,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y11  : virtual ::ccc::EE2x12 {
  virtual void  pqr(); // _ZN3ccc9FF2x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x12y113efgEv
  ~FF2x12y11(); // tgen
  FF2x12y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x12y113pqrEv");}
void  ccc::FF2x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x12y113efgEv");}
ccc::FF2x12y11 ::~FF2x12y11(){ note_dtor("_ZN3ccc9FF2x12y11E", this);} // tgen
ccc::FF2x12y11 ::FF2x12y11(){ note_ctor("_ZN3ccc9FF2x12y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y11E, buf);
    ::ccc::FF2x12y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y11E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y11E);
    dp->::ccc::FF2x12y11::~FF2x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y11E(Test__ZN3ccc9FF2x12y11E, "_ZN3ccc9FF2x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y11C1Ev();
extern void _ZN3ccc9FF2x12y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y11E[] = {
  NSPAIR(_ZN3ccc9FF2x12y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y11E[];
extern void _ZN3ccc9FF2x12y113efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF2x12y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y113efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y11E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y11E[] = {
  {&(_ZTVN3ccc9FF2x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y11E[];
static VTBL_ENTRY alt_thunk_names684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y11E = {  "_ZN3ccc9FF2x12y11E", // class name
  bases__ZN3ccc9FF2x12y11E, 2,
  &(vtc__ZN3ccc9FF2x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names684,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y12  : virtual ::ccc::EE2x12 {
  virtual void  abc(); // _ZN3ccc9FF2x12y123abcEv
  ~FF2x12y12(); // tgen
  FF2x12y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF2x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x12y123abcEv");}
ccc::FF2x12y12 ::~FF2x12y12(){ note_dtor("_ZN3ccc9FF2x12y12E", this);} // tgen
ccc::FF2x12y12 ::FF2x12y12(){ note_ctor("_ZN3ccc9FF2x12y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y12E, buf);
    ::ccc::FF2x12y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y12E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y12E);
    dp->::ccc::FF2x12y12::~FF2x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y12E(Test__ZN3ccc9FF2x12y12E, "_ZN3ccc9FF2x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y12C1Ev();
extern void _ZN3ccc9FF2x12y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y12E[] = {
  NSPAIR(_ZN3ccc9FF2x12y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x12y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y12E[] = {
  {&(_ZTVN3ccc9FF2x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y12E[];
static VTBL_ENTRY alt_thunk_names685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y12E = {  "_ZN3ccc9FF2x12y12E", // class name
  bases__ZN3ccc9FF2x12y12E, 2,
  &(vtc__ZN3ccc9FF2x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names685,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y13  : virtual ::ccc::EE2x12 {
  virtual void  efg(); // _ZN3ccc9FF2x12y133efgEv
  ~FF2x12y13(); // tgen
  FF2x12y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF2x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x12y133efgEv");}
ccc::FF2x12y13 ::~FF2x12y13(){ note_dtor("_ZN3ccc9FF2x12y13E", this);} // tgen
ccc::FF2x12y13 ::FF2x12y13(){ note_ctor("_ZN3ccc9FF2x12y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y13E, buf);
    ::ccc::FF2x12y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y13E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y13E);
    dp->::ccc::FF2x12y13::~FF2x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y13E(Test__ZN3ccc9FF2x12y13E, "_ZN3ccc9FF2x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y13C1Ev();
extern void _ZN3ccc9FF2x12y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y13E[] = {
  NSPAIR(_ZN3ccc9FF2x12y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y13E[];
extern void _ZN3ccc9FF2x12y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y13E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y13E[] = {
  {&(_ZTVN3ccc9FF2x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y13E[];
static VTBL_ENTRY alt_thunk_names686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y13E = {  "_ZN3ccc9FF2x12y13E", // class name
  bases__ZN3ccc9FF2x12y13E, 2,
  &(vtc__ZN3ccc9FF2x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names686,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y14  : virtual ::ccc::EE2x12 {
  virtual void  pqr(); // _ZN3ccc9FF2x12y143pqrEv
  ~FF2x12y14(); // tgen
  FF2x12y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y14E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF2x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x12y143pqrEv");}
ccc::FF2x12y14 ::~FF2x12y14(){ note_dtor("_ZN3ccc9FF2x12y14E", this);} // tgen
ccc::FF2x12y14 ::FF2x12y14(){ note_ctor("_ZN3ccc9FF2x12y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y14E, buf);
    ::ccc::FF2x12y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y14E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y14E);
    dp->::ccc::FF2x12y14::~FF2x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y14E(Test__ZN3ccc9FF2x12y14E, "_ZN3ccc9FF2x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y14C1Ev();
extern void _ZN3ccc9FF2x12y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y14E[] = {
  NSPAIR(_ZN3ccc9FF2x12y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF2x12y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x12y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y14E[] = {
  {&(_ZTVN3ccc9FF2x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y14E[];
static VTBL_ENTRY alt_thunk_names687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y14E = {  "_ZN3ccc9FF2x12y14E", // class name
  bases__ZN3ccc9FF2x12y14E, 2,
  &(vtc__ZN3ccc9FF2x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names687,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x12y15  : virtual ::ccc::EE2x12 {
  ~FF2x12y15(); // tgen
  FF2x12y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x12y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1}}
}
namespace ccc { 
ccc::FF2x12y15 ::~FF2x12y15(){ note_dtor("_ZN3ccc9FF2x12y15E", this);} // tgen
ccc::FF2x12y15 ::FF2x12y15(){ note_ctor("_ZN3ccc9FF2x12y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x12y15E, buf);
    ::ccc::FF2x12y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x12y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y15E");
    check_base_class_offset(lv, (::ccc::EE2x12*), 0, "_ZN3ccc9FF2x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x12y15E);
    dp->::ccc::FF2x12y15::~FF2x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x12y15E(Test__ZN3ccc9FF2x12y15E, "_ZN3ccc9FF2x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x12y15C1Ev();
extern void _ZN3ccc9FF2x12y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x12y15E[] = {
  NSPAIR(_ZN3ccc9FF2x12y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x12E[];
static Base_Class bases__ZN3ccc9FF2x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x12y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv)();
extern void _ZN3ccc6EE2x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x12y15E[] = {
  {&(_ZTVN3ccc9FF2x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x12y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x12E__NS_9FF2x12y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x12y15E[];
static VTBL_ENTRY alt_thunk_names688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE2x123abcEv,_ZTv0_n16_N3ccc6EE2x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x12y15E = {  "_ZN3ccc9FF2x12y15E", // class name
  bases__ZN3ccc9FF2x12y15E, 2,
  &(vtc__ZN3ccc9FF2x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x12y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x12y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x12y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x12y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names688,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y0  : virtual ::ccc::EE2x13 {
  virtual void  abc(); // _ZN3ccc8FF2x13y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y03pqrEv
  ~FF2x13y0(); // tgen
  FF2x13y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y03abcEv");}
void  ccc::FF2x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y03efgEv");}
void  ccc::FF2x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y03pqrEv");}
ccc::FF2x13y0 ::~FF2x13y0(){ note_dtor("_ZN3ccc8FF2x13y0E", this);} // tgen
ccc::FF2x13y0 ::FF2x13y0(){ note_ctor("_ZN3ccc8FF2x13y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y0E, buf);
    ::ccc::FF2x13y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y0E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y0E);
    dp->::ccc::FF2x13y0::~FF2x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y0E(Test__ZN3ccc8FF2x13y0E, "_ZN3ccc8FF2x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y0C1Ev();
extern void _ZN3ccc8FF2x13y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y0E[] = {
  NSPAIR(_ZN3ccc8FF2x13y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y0E[];
extern void _ZN3ccc8FF2x13y03efgEv();
extern void _ZN3ccc8FF2x13y03abcEv();
extern void _ZN3ccc8FF2x13y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y0E[] = {
  {&(_ZTVN3ccc8FF2x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y0E[];
static VTBL_ENTRY alt_thunk_names689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y0E = {  "_ZN3ccc8FF2x13y0E", // class name
  bases__ZN3ccc8FF2x13y0E, 2,
  &(vtc__ZN3ccc8FF2x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names689,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y1  : virtual ::ccc::EE2x13 {
  virtual void  abc(); // _ZN3ccc8FF2x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x13y13efgEv
  ~FF2x13y1(); // tgen
  FF2x13y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y13abcEv");}
void  ccc::FF2x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y13pqrEv");}
void  ccc::FF2x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y13efgEv");}
ccc::FF2x13y1 ::~FF2x13y1(){ note_dtor("_ZN3ccc8FF2x13y1E", this);} // tgen
ccc::FF2x13y1 ::FF2x13y1(){ note_ctor("_ZN3ccc8FF2x13y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y1E, buf);
    ::ccc::FF2x13y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y1E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y1E);
    dp->::ccc::FF2x13y1::~FF2x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y1E(Test__ZN3ccc8FF2x13y1E, "_ZN3ccc8FF2x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y1C1Ev();
extern void _ZN3ccc8FF2x13y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y1E[] = {
  NSPAIR(_ZN3ccc8FF2x13y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y1E[];
extern void _ZN3ccc8FF2x13y13efgEv();
extern void _ZN3ccc8FF2x13y13abcEv();
extern void _ZN3ccc8FF2x13y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y1E[] = {
  {&(_ZTVN3ccc8FF2x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y1E[];
static VTBL_ENTRY alt_thunk_names690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y1E = {  "_ZN3ccc8FF2x13y1E", // class name
  bases__ZN3ccc8FF2x13y1E, 2,
  &(vtc__ZN3ccc8FF2x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names690,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y2  : virtual ::ccc::EE2x13 {
  virtual void  efg(); // _ZN3ccc8FF2x13y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y23pqrEv
  ~FF2x13y2(); // tgen
  FF2x13y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y23efgEv");}
void  ccc::FF2x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y23abcEv");}
void  ccc::FF2x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y23pqrEv");}
ccc::FF2x13y2 ::~FF2x13y2(){ note_dtor("_ZN3ccc8FF2x13y2E", this);} // tgen
ccc::FF2x13y2 ::FF2x13y2(){ note_ctor("_ZN3ccc8FF2x13y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y2E, buf);
    ::ccc::FF2x13y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y2E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y2E);
    dp->::ccc::FF2x13y2::~FF2x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y2E(Test__ZN3ccc8FF2x13y2E, "_ZN3ccc8FF2x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y2C1Ev();
extern void _ZN3ccc8FF2x13y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y2E[] = {
  NSPAIR(_ZN3ccc8FF2x13y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y2E[];
extern void _ZN3ccc8FF2x13y23efgEv();
extern void _ZN3ccc8FF2x13y23abcEv();
extern void _ZN3ccc8FF2x13y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y2E[] = {
  {&(_ZTVN3ccc8FF2x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y2E[];
static VTBL_ENTRY alt_thunk_names691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y2E = {  "_ZN3ccc8FF2x13y2E", // class name
  bases__ZN3ccc8FF2x13y2E, 2,
  &(vtc__ZN3ccc8FF2x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names691,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y3  : virtual ::ccc::EE2x13 {
  virtual void  efg(); // _ZN3ccc8FF2x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x13y33abcEv
  ~FF2x13y3(); // tgen
  FF2x13y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y33efgEv");}
void  ccc::FF2x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y33pqrEv");}
void  ccc::FF2x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y33abcEv");}
ccc::FF2x13y3 ::~FF2x13y3(){ note_dtor("_ZN3ccc8FF2x13y3E", this);} // tgen
ccc::FF2x13y3 ::FF2x13y3(){ note_ctor("_ZN3ccc8FF2x13y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y3E, buf);
    ::ccc::FF2x13y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y3E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y3E);
    dp->::ccc::FF2x13y3::~FF2x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y3E(Test__ZN3ccc8FF2x13y3E, "_ZN3ccc8FF2x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y3C1Ev();
extern void _ZN3ccc8FF2x13y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y3E[] = {
  NSPAIR(_ZN3ccc8FF2x13y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y3E[];
extern void _ZN3ccc8FF2x13y33efgEv();
extern void _ZN3ccc8FF2x13y33abcEv();
extern void _ZN3ccc8FF2x13y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y3E[] = {
  {&(_ZTVN3ccc8FF2x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y3E[];
static VTBL_ENTRY alt_thunk_names692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y3E = {  "_ZN3ccc8FF2x13y3E", // class name
  bases__ZN3ccc8FF2x13y3E, 2,
  &(vtc__ZN3ccc8FF2x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names692,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y4  : virtual ::ccc::EE2x13 {
  virtual void  pqr(); // _ZN3ccc8FF2x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x13y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x13y43efgEv
  ~FF2x13y4(); // tgen
  FF2x13y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y43pqrEv");}
void  ccc::FF2x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y43abcEv");}
void  ccc::FF2x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y43efgEv");}
ccc::FF2x13y4 ::~FF2x13y4(){ note_dtor("_ZN3ccc8FF2x13y4E", this);} // tgen
ccc::FF2x13y4 ::FF2x13y4(){ note_ctor("_ZN3ccc8FF2x13y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y4E, buf);
    ::ccc::FF2x13y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y4E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y4E);
    dp->::ccc::FF2x13y4::~FF2x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y4E(Test__ZN3ccc8FF2x13y4E, "_ZN3ccc8FF2x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y4C1Ev();
extern void _ZN3ccc8FF2x13y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y4E[] = {
  NSPAIR(_ZN3ccc8FF2x13y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y4E[];
extern void _ZN3ccc8FF2x13y43efgEv();
extern void _ZN3ccc8FF2x13y43abcEv();
extern void _ZN3ccc8FF2x13y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y4E[] = {
  {&(_ZTVN3ccc8FF2x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y4E[];
static VTBL_ENTRY alt_thunk_names693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y4E = {  "_ZN3ccc8FF2x13y4E", // class name
  bases__ZN3ccc8FF2x13y4E, 2,
  &(vtc__ZN3ccc8FF2x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names693,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y5  : virtual ::ccc::EE2x13 {
  virtual void  pqr(); // _ZN3ccc8FF2x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x13y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x13y53abcEv
  ~FF2x13y5(); // tgen
  FF2x13y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y53pqrEv");}
void  ccc::FF2x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y53efgEv");}
void  ccc::FF2x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y53abcEv");}
ccc::FF2x13y5 ::~FF2x13y5(){ note_dtor("_ZN3ccc8FF2x13y5E", this);} // tgen
ccc::FF2x13y5 ::FF2x13y5(){ note_ctor("_ZN3ccc8FF2x13y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y5E, buf);
    ::ccc::FF2x13y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y5E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y5E);
    dp->::ccc::FF2x13y5::~FF2x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y5E(Test__ZN3ccc8FF2x13y5E, "_ZN3ccc8FF2x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y5C1Ev();
extern void _ZN3ccc8FF2x13y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y5E[] = {
  NSPAIR(_ZN3ccc8FF2x13y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y5E[];
extern void _ZN3ccc8FF2x13y53efgEv();
extern void _ZN3ccc8FF2x13y53abcEv();
extern void _ZN3ccc8FF2x13y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y5E[] = {
  {&(_ZTVN3ccc8FF2x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y5E[];
static VTBL_ENTRY alt_thunk_names694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y5E = {  "_ZN3ccc8FF2x13y5E", // class name
  bases__ZN3ccc8FF2x13y5E, 2,
  &(vtc__ZN3ccc8FF2x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names694,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y6  : virtual ::ccc::EE2x13 {
  virtual void  abc(); // _ZN3ccc8FF2x13y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x13y63efgEv
  ~FF2x13y6(); // tgen
  FF2x13y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y63abcEv");}
void  ccc::FF2x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y63efgEv");}
ccc::FF2x13y6 ::~FF2x13y6(){ note_dtor("_ZN3ccc8FF2x13y6E", this);} // tgen
ccc::FF2x13y6 ::FF2x13y6(){ note_ctor("_ZN3ccc8FF2x13y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y6E, buf);
    ::ccc::FF2x13y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y6E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y6E);
    dp->::ccc::FF2x13y6::~FF2x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y6E(Test__ZN3ccc8FF2x13y6E, "_ZN3ccc8FF2x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y6C1Ev();
extern void _ZN3ccc8FF2x13y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y6E[] = {
  NSPAIR(_ZN3ccc8FF2x13y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y6E[];
extern void _ZN3ccc8FF2x13y63efgEv();
extern void _ZN3ccc8FF2x13y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y6E[] = {
  {&(_ZTVN3ccc8FF2x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y6E[];
static VTBL_ENTRY alt_thunk_names695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y6E = {  "_ZN3ccc8FF2x13y6E", // class name
  bases__ZN3ccc8FF2x13y6E, 2,
  &(vtc__ZN3ccc8FF2x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names695,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y7  : virtual ::ccc::EE2x13 {
  virtual void  abc(); // _ZN3ccc8FF2x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y73pqrEv
  ~FF2x13y7(); // tgen
  FF2x13y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y73abcEv");}
void  ccc::FF2x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y73pqrEv");}
ccc::FF2x13y7 ::~FF2x13y7(){ note_dtor("_ZN3ccc8FF2x13y7E", this);} // tgen
ccc::FF2x13y7 ::FF2x13y7(){ note_ctor("_ZN3ccc8FF2x13y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y7E, buf);
    ::ccc::FF2x13y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y7E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y7E);
    dp->::ccc::FF2x13y7::~FF2x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y7E(Test__ZN3ccc8FF2x13y7E, "_ZN3ccc8FF2x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y7C1Ev();
extern void _ZN3ccc8FF2x13y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y7E[] = {
  NSPAIR(_ZN3ccc8FF2x13y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc8FF2x13y73abcEv();
extern void _ZN3ccc8FF2x13y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y7E[] = {
  {&(_ZTVN3ccc8FF2x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y7E[];
static VTBL_ENTRY alt_thunk_names696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y7E = {  "_ZN3ccc8FF2x13y7E", // class name
  bases__ZN3ccc8FF2x13y7E, 2,
  &(vtc__ZN3ccc8FF2x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names696,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y8  : virtual ::ccc::EE2x13 {
  virtual void  efg(); // _ZN3ccc8FF2x13y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x13y83abcEv
  ~FF2x13y8(); // tgen
  FF2x13y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y83efgEv");}
void  ccc::FF2x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x13y83abcEv");}
ccc::FF2x13y8 ::~FF2x13y8(){ note_dtor("_ZN3ccc8FF2x13y8E", this);} // tgen
ccc::FF2x13y8 ::FF2x13y8(){ note_ctor("_ZN3ccc8FF2x13y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y8E, buf);
    ::ccc::FF2x13y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y8E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y8E);
    dp->::ccc::FF2x13y8::~FF2x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y8E(Test__ZN3ccc8FF2x13y8E, "_ZN3ccc8FF2x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y8C1Ev();
extern void _ZN3ccc8FF2x13y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y8E[] = {
  NSPAIR(_ZN3ccc8FF2x13y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y8E[];
extern void _ZN3ccc8FF2x13y83efgEv();
extern void _ZN3ccc8FF2x13y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y8E[] = {
  {&(_ZTVN3ccc8FF2x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y8E[];
static VTBL_ENTRY alt_thunk_names697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y8E = {  "_ZN3ccc8FF2x13y8E", // class name
  bases__ZN3ccc8FF2x13y8E, 2,
  &(vtc__ZN3ccc8FF2x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names697,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y9  : virtual ::ccc::EE2x13 {
  virtual void  efg(); // _ZN3ccc8FF2x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x13y93pqrEv
  ~FF2x13y9(); // tgen
  FF2x13y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x13y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x13y93efgEv");}
void  ccc::FF2x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x13y93pqrEv");}
ccc::FF2x13y9 ::~FF2x13y9(){ note_dtor("_ZN3ccc8FF2x13y9E", this);} // tgen
ccc::FF2x13y9 ::FF2x13y9(){ note_ctor("_ZN3ccc8FF2x13y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x13y9E, buf);
    ::ccc::FF2x13y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x13y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y9E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc8FF2x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x13y9E);
    dp->::ccc::FF2x13y9::~FF2x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x13y9E(Test__ZN3ccc8FF2x13y9E, "_ZN3ccc8FF2x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x13y9C1Ev();
extern void _ZN3ccc8FF2x13y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x13y9E[] = {
  NSPAIR(_ZN3ccc8FF2x13y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc8FF2x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y9E[];
extern void _ZN3ccc8FF2x13y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x13y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x13y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x13y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x13y9E[] = {
  {&(_ZTVN3ccc8FF2x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x13y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_8FF2x13y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x13y9E[];
static VTBL_ENTRY alt_thunk_names698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x13y9E = {  "_ZN3ccc8FF2x13y9E", // class name
  bases__ZN3ccc8FF2x13y9E, 2,
  &(vtc__ZN3ccc8FF2x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x13y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x13y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x13y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x13y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names698,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y10  : virtual ::ccc::EE2x13 {
  virtual void  pqr(); // _ZN3ccc9FF2x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x13y103abcEv
  ~FF2x13y10(); // tgen
  FF2x13y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x13y103pqrEv");}
void  ccc::FF2x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x13y103abcEv");}
ccc::FF2x13y10 ::~FF2x13y10(){ note_dtor("_ZN3ccc9FF2x13y10E", this);} // tgen
ccc::FF2x13y10 ::FF2x13y10(){ note_ctor("_ZN3ccc9FF2x13y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y10E, buf);
    ::ccc::FF2x13y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y10E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y10E);
    dp->::ccc::FF2x13y10::~FF2x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y10E(Test__ZN3ccc9FF2x13y10E, "_ZN3ccc9FF2x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y10C1Ev();
extern void _ZN3ccc9FF2x13y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y10E[] = {
  NSPAIR(_ZN3ccc9FF2x13y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF2x13y103abcEv();
extern void _ZN3ccc9FF2x13y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y10E[] = {
  {&(_ZTVN3ccc9FF2x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y10E[];
static VTBL_ENTRY alt_thunk_names699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y10E = {  "_ZN3ccc9FF2x13y10E", // class name
  bases__ZN3ccc9FF2x13y10E, 2,
  &(vtc__ZN3ccc9FF2x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names699,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y11  : virtual ::ccc::EE2x13 {
  virtual void  pqr(); // _ZN3ccc9FF2x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x13y113efgEv
  ~FF2x13y11(); // tgen
  FF2x13y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x13y113pqrEv");}
void  ccc::FF2x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x13y113efgEv");}
ccc::FF2x13y11 ::~FF2x13y11(){ note_dtor("_ZN3ccc9FF2x13y11E", this);} // tgen
ccc::FF2x13y11 ::FF2x13y11(){ note_ctor("_ZN3ccc9FF2x13y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y11E, buf);
    ::ccc::FF2x13y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y11E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y11E);
    dp->::ccc::FF2x13y11::~FF2x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y11E(Test__ZN3ccc9FF2x13y11E, "_ZN3ccc9FF2x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y11C1Ev();
extern void _ZN3ccc9FF2x13y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y11E[] = {
  NSPAIR(_ZN3ccc9FF2x13y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y11E[];
extern void _ZN3ccc9FF2x13y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x13y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y11E[] = {
  {&(_ZTVN3ccc9FF2x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y11E[];
static VTBL_ENTRY alt_thunk_names700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y11E = {  "_ZN3ccc9FF2x13y11E", // class name
  bases__ZN3ccc9FF2x13y11E, 2,
  &(vtc__ZN3ccc9FF2x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names700,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y12  : virtual ::ccc::EE2x13 {
  virtual void  abc(); // _ZN3ccc9FF2x13y123abcEv
  ~FF2x13y12(); // tgen
  FF2x13y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF2x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x13y123abcEv");}
ccc::FF2x13y12 ::~FF2x13y12(){ note_dtor("_ZN3ccc9FF2x13y12E", this);} // tgen
ccc::FF2x13y12 ::FF2x13y12(){ note_ctor("_ZN3ccc9FF2x13y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y12E, buf);
    ::ccc::FF2x13y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y12E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y12E);
    dp->::ccc::FF2x13y12::~FF2x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y12E(Test__ZN3ccc9FF2x13y12E, "_ZN3ccc9FF2x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y12C1Ev();
extern void _ZN3ccc9FF2x13y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y12E[] = {
  NSPAIR(_ZN3ccc9FF2x13y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF2x13y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y12E[] = {
  {&(_ZTVN3ccc9FF2x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y12E[];
static VTBL_ENTRY alt_thunk_names701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y12E = {  "_ZN3ccc9FF2x13y12E", // class name
  bases__ZN3ccc9FF2x13y12E, 2,
  &(vtc__ZN3ccc9FF2x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names701,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y13  : virtual ::ccc::EE2x13 {
  virtual void  efg(); // _ZN3ccc9FF2x13y133efgEv
  ~FF2x13y13(); // tgen
  FF2x13y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF2x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x13y133efgEv");}
ccc::FF2x13y13 ::~FF2x13y13(){ note_dtor("_ZN3ccc9FF2x13y13E", this);} // tgen
ccc::FF2x13y13 ::FF2x13y13(){ note_ctor("_ZN3ccc9FF2x13y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y13E, buf);
    ::ccc::FF2x13y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y13E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y13E);
    dp->::ccc::FF2x13y13::~FF2x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y13E(Test__ZN3ccc9FF2x13y13E, "_ZN3ccc9FF2x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y13C1Ev();
extern void _ZN3ccc9FF2x13y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y13E[] = {
  NSPAIR(_ZN3ccc9FF2x13y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y13E[];
extern void _ZN3ccc9FF2x13y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y13E[] = {
  {&(_ZTVN3ccc9FF2x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y13E[];
static VTBL_ENTRY alt_thunk_names702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y13E = {  "_ZN3ccc9FF2x13y13E", // class name
  bases__ZN3ccc9FF2x13y13E, 2,
  &(vtc__ZN3ccc9FF2x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names702,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y14  : virtual ::ccc::EE2x13 {
  virtual void  pqr(); // _ZN3ccc9FF2x13y143pqrEv
  ~FF2x13y14(); // tgen
  FF2x13y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF2x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x13y143pqrEv");}
ccc::FF2x13y14 ::~FF2x13y14(){ note_dtor("_ZN3ccc9FF2x13y14E", this);} // tgen
ccc::FF2x13y14 ::FF2x13y14(){ note_ctor("_ZN3ccc9FF2x13y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y14E, buf);
    ::ccc::FF2x13y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y14E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y14E);
    dp->::ccc::FF2x13y14::~FF2x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y14E(Test__ZN3ccc9FF2x13y14E, "_ZN3ccc9FF2x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y14C1Ev();
extern void _ZN3ccc9FF2x13y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y14E[] = {
  NSPAIR(_ZN3ccc9FF2x13y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x13y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x13y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y14E[] = {
  {&(_ZTVN3ccc9FF2x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y14E[];
static VTBL_ENTRY alt_thunk_names703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y14E = {  "_ZN3ccc9FF2x13y14E", // class name
  bases__ZN3ccc9FF2x13y14E, 2,
  &(vtc__ZN3ccc9FF2x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names703,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x13y15  : virtual ::ccc::EE2x13 {
  ~FF2x13y15(); // tgen
  FF2x13y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x13y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1}}
}
namespace ccc { 
ccc::FF2x13y15 ::~FF2x13y15(){ note_dtor("_ZN3ccc9FF2x13y15E", this);} // tgen
ccc::FF2x13y15 ::FF2x13y15(){ note_ctor("_ZN3ccc9FF2x13y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x13y15E, buf);
    ::ccc::FF2x13y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x13y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y15E");
    check_base_class_offset(lv, (::ccc::EE2x13*), 0, "_ZN3ccc9FF2x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x13y15E);
    dp->::ccc::FF2x13y15::~FF2x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x13y15E(Test__ZN3ccc9FF2x13y15E, "_ZN3ccc9FF2x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x13y15C1Ev();
extern void _ZN3ccc9FF2x13y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x13y15E[] = {
  NSPAIR(_ZN3ccc9FF2x13y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x13E[];
static Base_Class bases__ZN3ccc9FF2x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x13y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x13y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv)();
extern void _ZN3ccc6EE2x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x13y15E[] = {
  {&(_ZTVN3ccc9FF2x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x13y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x13E__NS_9FF2x13y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x13y15E[];
static VTBL_ENTRY alt_thunk_names704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE2x133efgEv,_ZTv0_n12_N3ccc6EE2x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x13y15E = {  "_ZN3ccc9FF2x13y15E", // class name
  bases__ZN3ccc9FF2x13y15E, 2,
  &(vtc__ZN3ccc9FF2x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x13y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x13y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x13y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x13y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names704,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y0  : virtual ::ccc::EE2x14 {
  virtual void  abc(); // _ZN3ccc8FF2x14y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y03pqrEv
  ~FF2x14y0(); // tgen
  FF2x14y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y0E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y03abcEv");}
void  ccc::FF2x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y03efgEv");}
void  ccc::FF2x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y03pqrEv");}
ccc::FF2x14y0 ::~FF2x14y0(){ note_dtor("_ZN3ccc8FF2x14y0E", this);} // tgen
ccc::FF2x14y0 ::FF2x14y0(){ note_ctor("_ZN3ccc8FF2x14y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y0E, buf);
    ::ccc::FF2x14y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y0E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y0E);
    dp->::ccc::FF2x14y0::~FF2x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y0E(Test__ZN3ccc8FF2x14y0E, "_ZN3ccc8FF2x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y0C1Ev();
extern void _ZN3ccc8FF2x14y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y0E[] = {
  NSPAIR(_ZN3ccc8FF2x14y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y0E[];
extern void _ZN3ccc8FF2x14y03efgEv();
extern void _ZN3ccc8FF2x14y03abcEv();
extern void _ZN3ccc8FF2x14y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y0E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y0E[] = {
  {&(_ZTVN3ccc8FF2x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y0E[];
static VTBL_ENTRY alt_thunk_names705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y0E = {  "_ZN3ccc8FF2x14y0E", // class name
  bases__ZN3ccc8FF2x14y0E, 2,
  &(vtc__ZN3ccc8FF2x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names705,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y1  : virtual ::ccc::EE2x14 {
  virtual void  abc(); // _ZN3ccc8FF2x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x14y13efgEv
  ~FF2x14y1(); // tgen
  FF2x14y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y1E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y13abcEv");}
void  ccc::FF2x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y13pqrEv");}
void  ccc::FF2x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y13efgEv");}
ccc::FF2x14y1 ::~FF2x14y1(){ note_dtor("_ZN3ccc8FF2x14y1E", this);} // tgen
ccc::FF2x14y1 ::FF2x14y1(){ note_ctor("_ZN3ccc8FF2x14y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y1E, buf);
    ::ccc::FF2x14y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y1E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y1E);
    dp->::ccc::FF2x14y1::~FF2x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y1E(Test__ZN3ccc8FF2x14y1E, "_ZN3ccc8FF2x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y1C1Ev();
extern void _ZN3ccc8FF2x14y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y1E[] = {
  NSPAIR(_ZN3ccc8FF2x14y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y1E[];
extern void _ZN3ccc8FF2x14y13efgEv();
extern void _ZN3ccc8FF2x14y13abcEv();
extern void _ZN3ccc8FF2x14y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y1E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y1E[] = {
  {&(_ZTVN3ccc8FF2x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y1E[];
static VTBL_ENTRY alt_thunk_names706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y1E = {  "_ZN3ccc8FF2x14y1E", // class name
  bases__ZN3ccc8FF2x14y1E, 2,
  &(vtc__ZN3ccc8FF2x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names706,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y2  : virtual ::ccc::EE2x14 {
  virtual void  efg(); // _ZN3ccc8FF2x14y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y23pqrEv
  ~FF2x14y2(); // tgen
  FF2x14y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y2E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y23efgEv");}
void  ccc::FF2x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y23abcEv");}
void  ccc::FF2x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y23pqrEv");}
ccc::FF2x14y2 ::~FF2x14y2(){ note_dtor("_ZN3ccc8FF2x14y2E", this);} // tgen
ccc::FF2x14y2 ::FF2x14y2(){ note_ctor("_ZN3ccc8FF2x14y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y2E, buf);
    ::ccc::FF2x14y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y2E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y2E);
    dp->::ccc::FF2x14y2::~FF2x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y2E(Test__ZN3ccc8FF2x14y2E, "_ZN3ccc8FF2x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y2C1Ev();
extern void _ZN3ccc8FF2x14y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y2E[] = {
  NSPAIR(_ZN3ccc8FF2x14y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y2E[];
extern void _ZN3ccc8FF2x14y23efgEv();
extern void _ZN3ccc8FF2x14y23abcEv();
extern void _ZN3ccc8FF2x14y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y2E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y2E[] = {
  {&(_ZTVN3ccc8FF2x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y2E[];
static VTBL_ENTRY alt_thunk_names707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y2E = {  "_ZN3ccc8FF2x14y2E", // class name
  bases__ZN3ccc8FF2x14y2E, 2,
  &(vtc__ZN3ccc8FF2x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names707,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y3  : virtual ::ccc::EE2x14 {
  virtual void  efg(); // _ZN3ccc8FF2x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x14y33abcEv
  ~FF2x14y3(); // tgen
  FF2x14y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y3E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y33efgEv");}
void  ccc::FF2x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y33pqrEv");}
void  ccc::FF2x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y33abcEv");}
ccc::FF2x14y3 ::~FF2x14y3(){ note_dtor("_ZN3ccc8FF2x14y3E", this);} // tgen
ccc::FF2x14y3 ::FF2x14y3(){ note_ctor("_ZN3ccc8FF2x14y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y3E, buf);
    ::ccc::FF2x14y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y3E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y3E);
    dp->::ccc::FF2x14y3::~FF2x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y3E(Test__ZN3ccc8FF2x14y3E, "_ZN3ccc8FF2x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y3C1Ev();
extern void _ZN3ccc8FF2x14y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y3E[] = {
  NSPAIR(_ZN3ccc8FF2x14y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y3E[];
extern void _ZN3ccc8FF2x14y33efgEv();
extern void _ZN3ccc8FF2x14y33abcEv();
extern void _ZN3ccc8FF2x14y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y3E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y3E[] = {
  {&(_ZTVN3ccc8FF2x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y3E[];
static VTBL_ENTRY alt_thunk_names708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y3E = {  "_ZN3ccc8FF2x14y3E", // class name
  bases__ZN3ccc8FF2x14y3E, 2,
  &(vtc__ZN3ccc8FF2x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names708,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y4  : virtual ::ccc::EE2x14 {
  virtual void  pqr(); // _ZN3ccc8FF2x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x14y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x14y43efgEv
  ~FF2x14y4(); // tgen
  FF2x14y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y4E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y43pqrEv");}
void  ccc::FF2x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y43abcEv");}
void  ccc::FF2x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y43efgEv");}
ccc::FF2x14y4 ::~FF2x14y4(){ note_dtor("_ZN3ccc8FF2x14y4E", this);} // tgen
ccc::FF2x14y4 ::FF2x14y4(){ note_ctor("_ZN3ccc8FF2x14y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y4E, buf);
    ::ccc::FF2x14y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y4E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y4E);
    dp->::ccc::FF2x14y4::~FF2x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y4E(Test__ZN3ccc8FF2x14y4E, "_ZN3ccc8FF2x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y4C1Ev();
extern void _ZN3ccc8FF2x14y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y4E[] = {
  NSPAIR(_ZN3ccc8FF2x14y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y4E[];
extern void _ZN3ccc8FF2x14y43efgEv();
extern void _ZN3ccc8FF2x14y43abcEv();
extern void _ZN3ccc8FF2x14y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y4E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y4E[] = {
  {&(_ZTVN3ccc8FF2x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y4E[];
static VTBL_ENTRY alt_thunk_names709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y4E = {  "_ZN3ccc8FF2x14y4E", // class name
  bases__ZN3ccc8FF2x14y4E, 2,
  &(vtc__ZN3ccc8FF2x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names709,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y5  : virtual ::ccc::EE2x14 {
  virtual void  pqr(); // _ZN3ccc8FF2x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x14y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x14y53abcEv
  ~FF2x14y5(); // tgen
  FF2x14y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y5E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y53pqrEv");}
void  ccc::FF2x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y53efgEv");}
void  ccc::FF2x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y53abcEv");}
ccc::FF2x14y5 ::~FF2x14y5(){ note_dtor("_ZN3ccc8FF2x14y5E", this);} // tgen
ccc::FF2x14y5 ::FF2x14y5(){ note_ctor("_ZN3ccc8FF2x14y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y5E, buf);
    ::ccc::FF2x14y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y5E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y5E);
    dp->::ccc::FF2x14y5::~FF2x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y5E(Test__ZN3ccc8FF2x14y5E, "_ZN3ccc8FF2x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y5C1Ev();
extern void _ZN3ccc8FF2x14y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y5E[] = {
  NSPAIR(_ZN3ccc8FF2x14y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y5E[];
extern void _ZN3ccc8FF2x14y53efgEv();
extern void _ZN3ccc8FF2x14y53abcEv();
extern void _ZN3ccc8FF2x14y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y5E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y5E[] = {
  {&(_ZTVN3ccc8FF2x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y5E[];
static VTBL_ENTRY alt_thunk_names710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y5E = {  "_ZN3ccc8FF2x14y5E", // class name
  bases__ZN3ccc8FF2x14y5E, 2,
  &(vtc__ZN3ccc8FF2x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names710,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y6  : virtual ::ccc::EE2x14 {
  virtual void  abc(); // _ZN3ccc8FF2x14y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x14y63efgEv
  ~FF2x14y6(); // tgen
  FF2x14y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y6E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y63abcEv");}
void  ccc::FF2x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y63efgEv");}
ccc::FF2x14y6 ::~FF2x14y6(){ note_dtor("_ZN3ccc8FF2x14y6E", this);} // tgen
ccc::FF2x14y6 ::FF2x14y6(){ note_ctor("_ZN3ccc8FF2x14y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y6E, buf);
    ::ccc::FF2x14y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y6E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y6E);
    dp->::ccc::FF2x14y6::~FF2x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y6E(Test__ZN3ccc8FF2x14y6E, "_ZN3ccc8FF2x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y6C1Ev();
extern void _ZN3ccc8FF2x14y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y6E[] = {
  NSPAIR(_ZN3ccc8FF2x14y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y6E[];
extern void _ZN3ccc8FF2x14y63efgEv();
extern void _ZN3ccc8FF2x14y63abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y6E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y6E[] = {
  {&(_ZTVN3ccc8FF2x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y6E[];
static VTBL_ENTRY alt_thunk_names711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y6E = {  "_ZN3ccc8FF2x14y6E", // class name
  bases__ZN3ccc8FF2x14y6E, 2,
  &(vtc__ZN3ccc8FF2x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names711,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y7  : virtual ::ccc::EE2x14 {
  virtual void  abc(); // _ZN3ccc8FF2x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y73pqrEv
  ~FF2x14y7(); // tgen
  FF2x14y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y7E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y73abcEv");}
void  ccc::FF2x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y73pqrEv");}
ccc::FF2x14y7 ::~FF2x14y7(){ note_dtor("_ZN3ccc8FF2x14y7E", this);} // tgen
ccc::FF2x14y7 ::FF2x14y7(){ note_ctor("_ZN3ccc8FF2x14y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y7E, buf);
    ::ccc::FF2x14y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y7E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y7E);
    dp->::ccc::FF2x14y7::~FF2x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y7E(Test__ZN3ccc8FF2x14y7E, "_ZN3ccc8FF2x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y7C1Ev();
extern void _ZN3ccc8FF2x14y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y7E[] = {
  NSPAIR(_ZN3ccc8FF2x14y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x14y73abcEv();
extern void _ZN3ccc8FF2x14y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y7E[] = {
  {&(_ZTVN3ccc8FF2x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y7E[];
static VTBL_ENTRY alt_thunk_names712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y7E = {  "_ZN3ccc8FF2x14y7E", // class name
  bases__ZN3ccc8FF2x14y7E, 2,
  &(vtc__ZN3ccc8FF2x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names712,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y8  : virtual ::ccc::EE2x14 {
  virtual void  efg(); // _ZN3ccc8FF2x14y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x14y83abcEv
  ~FF2x14y8(); // tgen
  FF2x14y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y8E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y83efgEv");}
void  ccc::FF2x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x14y83abcEv");}
ccc::FF2x14y8 ::~FF2x14y8(){ note_dtor("_ZN3ccc8FF2x14y8E", this);} // tgen
ccc::FF2x14y8 ::FF2x14y8(){ note_ctor("_ZN3ccc8FF2x14y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y8E, buf);
    ::ccc::FF2x14y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y8E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y8E);
    dp->::ccc::FF2x14y8::~FF2x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y8E(Test__ZN3ccc8FF2x14y8E, "_ZN3ccc8FF2x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y8C1Ev();
extern void _ZN3ccc8FF2x14y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y8E[] = {
  NSPAIR(_ZN3ccc8FF2x14y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y8E[];
extern void _ZN3ccc8FF2x14y83efgEv();
extern void _ZN3ccc8FF2x14y83abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y83abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y8E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y8E[] = {
  {&(_ZTVN3ccc8FF2x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y8E[];
static VTBL_ENTRY alt_thunk_names713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y8E = {  "_ZN3ccc8FF2x14y8E", // class name
  bases__ZN3ccc8FF2x14y8E, 2,
  &(vtc__ZN3ccc8FF2x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names713,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y9  : virtual ::ccc::EE2x14 {
  virtual void  efg(); // _ZN3ccc8FF2x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x14y93pqrEv
  ~FF2x14y9(); // tgen
  FF2x14y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x14y9E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x14y93efgEv");}
void  ccc::FF2x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x14y93pqrEv");}
ccc::FF2x14y9 ::~FF2x14y9(){ note_dtor("_ZN3ccc8FF2x14y9E", this);} // tgen
ccc::FF2x14y9 ::FF2x14y9(){ note_ctor("_ZN3ccc8FF2x14y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x14y9E, buf);
    ::ccc::FF2x14y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x14y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y9E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc8FF2x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x14y9E);
    dp->::ccc::FF2x14y9::~FF2x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x14y9E(Test__ZN3ccc8FF2x14y9E, "_ZN3ccc8FF2x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x14y9C1Ev();
extern void _ZN3ccc8FF2x14y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x14y9E[] = {
  NSPAIR(_ZN3ccc8FF2x14y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc8FF2x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y9E[];
extern void _ZN3ccc8FF2x14y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x14y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x14y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x14y9E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x14y9E[] = {
  {&(_ZTVN3ccc8FF2x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x14y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_8FF2x14y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x14y9E[];
static VTBL_ENTRY alt_thunk_names714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF2x14y9E = {  "_ZN3ccc8FF2x14y9E", // class name
  bases__ZN3ccc8FF2x14y9E, 2,
  &(vtc__ZN3ccc8FF2x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x14y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x14y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x14y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x14y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names714,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y10  : virtual ::ccc::EE2x14 {
  virtual void  pqr(); // _ZN3ccc9FF2x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x14y103abcEv
  ~FF2x14y10(); // tgen
  FF2x14y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y10E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x14y103pqrEv");}
void  ccc::FF2x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x14y103abcEv");}
ccc::FF2x14y10 ::~FF2x14y10(){ note_dtor("_ZN3ccc9FF2x14y10E", this);} // tgen
ccc::FF2x14y10 ::FF2x14y10(){ note_ctor("_ZN3ccc9FF2x14y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y10E, buf);
    ::ccc::FF2x14y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y10E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y10E);
    dp->::ccc::FF2x14y10::~FF2x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y10E(Test__ZN3ccc9FF2x14y10E, "_ZN3ccc9FF2x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y10C1Ev();
extern void _ZN3ccc9FF2x14y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y10E[] = {
  NSPAIR(_ZN3ccc9FF2x14y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x14y103abcEv();
extern void _ZN3ccc9FF2x14y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y10E[] = {
  {&(_ZTVN3ccc9FF2x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y10E[];
static VTBL_ENTRY alt_thunk_names715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y10E = {  "_ZN3ccc9FF2x14y10E", // class name
  bases__ZN3ccc9FF2x14y10E, 2,
  &(vtc__ZN3ccc9FF2x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names715,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y11  : virtual ::ccc::EE2x14 {
  virtual void  pqr(); // _ZN3ccc9FF2x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x14y113efgEv
  ~FF2x14y11(); // tgen
  FF2x14y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y11E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF2x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x14y113pqrEv");}
void  ccc::FF2x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x14y113efgEv");}
ccc::FF2x14y11 ::~FF2x14y11(){ note_dtor("_ZN3ccc9FF2x14y11E", this);} // tgen
ccc::FF2x14y11 ::FF2x14y11(){ note_ctor("_ZN3ccc9FF2x14y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y11E, buf);
    ::ccc::FF2x14y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y11E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y11E);
    dp->::ccc::FF2x14y11::~FF2x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y11E(Test__ZN3ccc9FF2x14y11E, "_ZN3ccc9FF2x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y11C1Ev();
extern void _ZN3ccc9FF2x14y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y11E[] = {
  NSPAIR(_ZN3ccc9FF2x14y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y11E[];
extern void _ZN3ccc9FF2x14y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x14y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y11E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y11E[] = {
  {&(_ZTVN3ccc9FF2x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y11E[];
static VTBL_ENTRY alt_thunk_names716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y11E = {  "_ZN3ccc9FF2x14y11E", // class name
  bases__ZN3ccc9FF2x14y11E, 2,
  &(vtc__ZN3ccc9FF2x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names716,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y12  : virtual ::ccc::EE2x14 {
  virtual void  abc(); // _ZN3ccc9FF2x14y123abcEv
  ~FF2x14y12(); // tgen
  FF2x14y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF2x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x14y123abcEv");}
ccc::FF2x14y12 ::~FF2x14y12(){ note_dtor("_ZN3ccc9FF2x14y12E", this);} // tgen
ccc::FF2x14y12 ::FF2x14y12(){ note_ctor("_ZN3ccc9FF2x14y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y12E, buf);
    ::ccc::FF2x14y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y12E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y12E);
    dp->::ccc::FF2x14y12::~FF2x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y12E(Test__ZN3ccc9FF2x14y12E, "_ZN3ccc9FF2x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y12C1Ev();
extern void _ZN3ccc9FF2x14y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y12E[] = {
  NSPAIR(_ZN3ccc9FF2x14y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x14y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y12E[] = {
  {&(_ZTVN3ccc9FF2x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y12E[];
static VTBL_ENTRY alt_thunk_names717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y12E = {  "_ZN3ccc9FF2x14y12E", // class name
  bases__ZN3ccc9FF2x14y12E, 2,
  &(vtc__ZN3ccc9FF2x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names717,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y13  : virtual ::ccc::EE2x14 {
  virtual void  efg(); // _ZN3ccc9FF2x14y133efgEv
  ~FF2x14y13(); // tgen
  FF2x14y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF2x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x14y133efgEv");}
ccc::FF2x14y13 ::~FF2x14y13(){ note_dtor("_ZN3ccc9FF2x14y13E", this);} // tgen
ccc::FF2x14y13 ::FF2x14y13(){ note_ctor("_ZN3ccc9FF2x14y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y13E, buf);
    ::ccc::FF2x14y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y13E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y13E);
    dp->::ccc::FF2x14y13::~FF2x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y13E(Test__ZN3ccc9FF2x14y13E, "_ZN3ccc9FF2x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y13C1Ev();
extern void _ZN3ccc9FF2x14y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y13E[] = {
  NSPAIR(_ZN3ccc9FF2x14y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y13E[];
extern void _ZN3ccc9FF2x14y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y13E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y13E[] = {
  {&(_ZTVN3ccc9FF2x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y13E[];
static VTBL_ENTRY alt_thunk_names718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y13E = {  "_ZN3ccc9FF2x14y13E", // class name
  bases__ZN3ccc9FF2x14y13E, 2,
  &(vtc__ZN3ccc9FF2x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names718,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y14  : virtual ::ccc::EE2x14 {
  virtual void  pqr(); // _ZN3ccc9FF2x14y143pqrEv
  ~FF2x14y14(); // tgen
  FF2x14y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y14E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1}
}
namespace ccc { 
void  ccc::FF2x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x14y143pqrEv");}
ccc::FF2x14y14 ::~FF2x14y14(){ note_dtor("_ZN3ccc9FF2x14y14E", this);} // tgen
ccc::FF2x14y14 ::FF2x14y14(){ note_ctor("_ZN3ccc9FF2x14y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y14E, buf);
    ::ccc::FF2x14y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y14E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y14E);
    dp->::ccc::FF2x14y14::~FF2x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y14E(Test__ZN3ccc9FF2x14y14E, "_ZN3ccc9FF2x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y14C1Ev();
extern void _ZN3ccc9FF2x14y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y14E[] = {
  NSPAIR(_ZN3ccc9FF2x14y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x14y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x14y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y14E[] = {
  {&(_ZTVN3ccc9FF2x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y14E[];
static VTBL_ENTRY alt_thunk_names719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y14E = {  "_ZN3ccc9FF2x14y14E", // class name
  bases__ZN3ccc9FF2x14y14E, 2,
  &(vtc__ZN3ccc9FF2x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names719,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x14y15  : virtual ::ccc::EE2x14 {
  ~FF2x14y15(); // tgen
  FF2x14y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x14y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1}}
}
namespace ccc { 
ccc::FF2x14y15 ::~FF2x14y15(){ note_dtor("_ZN3ccc9FF2x14y15E", this);} // tgen
ccc::FF2x14y15 ::FF2x14y15(){ note_ctor("_ZN3ccc9FF2x14y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x14y15E, buf);
    ::ccc::FF2x14y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x14y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y15E");
    check_base_class_offset(lv, (::ccc::EE2x14*), 0, "_ZN3ccc9FF2x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x14y15E);
    dp->::ccc::FF2x14y15::~FF2x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x14y15E(Test__ZN3ccc9FF2x14y15E, "_ZN3ccc9FF2x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x14y15C1Ev();
extern void _ZN3ccc9FF2x14y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x14y15E[] = {
  NSPAIR(_ZN3ccc9FF2x14y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x14E[];
static Base_Class bases__ZN3ccc9FF2x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF2x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x14y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv)();
extern void _ZN3ccc6EE2x143pqrEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x14y15E[] = {
  {&(_ZTVN3ccc9FF2x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x14y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x14E__NS_9FF2x14y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x14y15E[];
static VTBL_ENTRY alt_thunk_names720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE2x143pqrEv,_ZTv0_n20_N3ccc6EE2x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE2x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF2x14y15E = {  "_ZN3ccc9FF2x14y15E", // class name
  bases__ZN3ccc9FF2x14y15E, 2,
  &(vtc__ZN3ccc9FF2x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x14y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x14y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x14y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x14y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names720,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF2x15y0  : virtual ::ccc::EE2x15 {
  virtual void  abc(); // _ZN3ccc8FF2x15y03abcEv
  virtual void  efg(); // _ZN3ccc8FF2x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y03pqrEv
  ~FF2x15y0(); // tgen
  FF2x15y0(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y0E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y03abcEv");}
void  ccc::FF2x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y03efgEv");}
void  ccc::FF2x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y03pqrEv");}
ccc::FF2x15y0 ::~FF2x15y0(){ note_dtor("_ZN3ccc8FF2x15y0E", this);} // tgen
ccc::FF2x15y0 ::FF2x15y0(){ note_ctor("_ZN3ccc8FF2x15y0E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y0E, buf);
    ::ccc::FF2x15y0 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y0E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y0E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y0E);
    dp->::ccc::FF2x15y0::~FF2x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y0E(Test__ZN3ccc8FF2x15y0E, "_ZN3ccc8FF2x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y0C1Ev();
extern void _ZN3ccc8FF2x15y0D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y0E[] = {
  NSPAIR(_ZN3ccc8FF2x15y0C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y0E[];
extern void _ZN3ccc8FF2x15y03efgEv();
extern void _ZN3ccc8FF2x15y03abcEv();
extern void _ZN3ccc8FF2x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y0E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y0E[] = {
  {&(_ZTVN3ccc8FF2x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y0E[];
Class_Descriptor cd__ZN3ccc8FF2x15y0E = {  "_ZN3ccc8FF2x15y0E", // class name
  bases__ZN3ccc8FF2x15y0E, 2,
  &(vtc__ZN3ccc8FF2x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y0E),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
namespace ccc { 
struct  FF2x15y1  : virtual ::ccc::EE2x15 {
  virtual void  abc(); // _ZN3ccc8FF2x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x15y13efgEv
  ~FF2x15y1(); // tgen
  FF2x15y1(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y1E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y13abcEv");}
void  ccc::FF2x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y13pqrEv");}
void  ccc::FF2x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y13efgEv");}
ccc::FF2x15y1 ::~FF2x15y1(){ note_dtor("_ZN3ccc8FF2x15y1E", this);} // tgen
ccc::FF2x15y1 ::FF2x15y1(){ note_ctor("_ZN3ccc8FF2x15y1E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y1E, buf);
    ::ccc::FF2x15y1 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y1E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y1E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y1E);
    dp->::ccc::FF2x15y1::~FF2x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y1E(Test__ZN3ccc8FF2x15y1E, "_ZN3ccc8FF2x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y1C1Ev();
extern void _ZN3ccc8FF2x15y1D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y1E[] = {
  NSPAIR(_ZN3ccc8FF2x15y1C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y1E[];
extern void _ZN3ccc8FF2x15y13efgEv();
extern void _ZN3ccc8FF2x15y13abcEv();
extern void _ZN3ccc8FF2x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y1E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y1E[] = {
  {&(_ZTVN3ccc8FF2x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y1E[];
Class_Descriptor cd__ZN3ccc8FF2x15y1E = {  "_ZN3ccc8FF2x15y1E", // class name
  bases__ZN3ccc8FF2x15y1E, 2,
  &(vtc__ZN3ccc8FF2x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y1E),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
namespace ccc { 
struct  FF2x15y2  : virtual ::ccc::EE2x15 {
  virtual void  efg(); // _ZN3ccc8FF2x15y23efgEv
  virtual void  abc(); // _ZN3ccc8FF2x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y23pqrEv
  ~FF2x15y2(); // tgen
  FF2x15y2(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y2E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y23efgEv");}
void  ccc::FF2x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y23abcEv");}
void  ccc::FF2x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y23pqrEv");}
ccc::FF2x15y2 ::~FF2x15y2(){ note_dtor("_ZN3ccc8FF2x15y2E", this);} // tgen
ccc::FF2x15y2 ::FF2x15y2(){ note_ctor("_ZN3ccc8FF2x15y2E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y2E, buf);
    ::ccc::FF2x15y2 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y2E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y2E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y2E);
    dp->::ccc::FF2x15y2::~FF2x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y2E(Test__ZN3ccc8FF2x15y2E, "_ZN3ccc8FF2x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y2C1Ev();
extern void _ZN3ccc8FF2x15y2D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y2E[] = {
  NSPAIR(_ZN3ccc8FF2x15y2C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y2E[];
extern void _ZN3ccc8FF2x15y23efgEv();
extern void _ZN3ccc8FF2x15y23abcEv();
extern void _ZN3ccc8FF2x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y2E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y2E[] = {
  {&(_ZTVN3ccc8FF2x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y2E[];
Class_Descriptor cd__ZN3ccc8FF2x15y2E = {  "_ZN3ccc8FF2x15y2E", // class name
  bases__ZN3ccc8FF2x15y2E, 2,
  &(vtc__ZN3ccc8FF2x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y2E),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
namespace ccc { 
struct  FF2x15y3  : virtual ::ccc::EE2x15 {
  virtual void  efg(); // _ZN3ccc8FF2x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x15y33abcEv
  ~FF2x15y3(); // tgen
  FF2x15y3(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y3E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y33efgEv");}
void  ccc::FF2x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y33pqrEv");}
void  ccc::FF2x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y33abcEv");}
ccc::FF2x15y3 ::~FF2x15y3(){ note_dtor("_ZN3ccc8FF2x15y3E", this);} // tgen
ccc::FF2x15y3 ::FF2x15y3(){ note_ctor("_ZN3ccc8FF2x15y3E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y3E, buf);
    ::ccc::FF2x15y3 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y3E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y3E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y3E);
    dp->::ccc::FF2x15y3::~FF2x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y3E(Test__ZN3ccc8FF2x15y3E, "_ZN3ccc8FF2x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y3C1Ev();
extern void _ZN3ccc8FF2x15y3D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y3E[] = {
  NSPAIR(_ZN3ccc8FF2x15y3C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y3E[];
extern void _ZN3ccc8FF2x15y33efgEv();
extern void _ZN3ccc8FF2x15y33abcEv();
extern void _ZN3ccc8FF2x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y3E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y3E[] = {
  {&(_ZTVN3ccc8FF2x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y3E[];
Class_Descriptor cd__ZN3ccc8FF2x15y3E = {  "_ZN3ccc8FF2x15y3E", // class name
  bases__ZN3ccc8FF2x15y3E, 2,
  &(vtc__ZN3ccc8FF2x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y3E),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
namespace ccc { 
struct  FF2x15y4  : virtual ::ccc::EE2x15 {
  virtual void  pqr(); // _ZN3ccc8FF2x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF2x15y43abcEv
  virtual void  efg(); // _ZN3ccc8FF2x15y43efgEv
  ~FF2x15y4(); // tgen
  FF2x15y4(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y4E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y43pqrEv");}
void  ccc::FF2x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y43abcEv");}
void  ccc::FF2x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y43efgEv");}
ccc::FF2x15y4 ::~FF2x15y4(){ note_dtor("_ZN3ccc8FF2x15y4E", this);} // tgen
ccc::FF2x15y4 ::FF2x15y4(){ note_ctor("_ZN3ccc8FF2x15y4E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y4E, buf);
    ::ccc::FF2x15y4 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y4E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y4E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y4E);
    dp->::ccc::FF2x15y4::~FF2x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y4E(Test__ZN3ccc8FF2x15y4E, "_ZN3ccc8FF2x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y4C1Ev();
extern void _ZN3ccc8FF2x15y4D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y4E[] = {
  NSPAIR(_ZN3ccc8FF2x15y4C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y4E[];
extern void _ZN3ccc8FF2x15y43efgEv();
extern void _ZN3ccc8FF2x15y43abcEv();
extern void _ZN3ccc8FF2x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y4E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y4E[] = {
  {&(_ZTVN3ccc8FF2x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y4E[];
Class_Descriptor cd__ZN3ccc8FF2x15y4E = {  "_ZN3ccc8FF2x15y4E", // class name
  bases__ZN3ccc8FF2x15y4E, 2,
  &(vtc__ZN3ccc8FF2x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y4E),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
namespace ccc { 
struct  FF2x15y5  : virtual ::ccc::EE2x15 {
  virtual void  pqr(); // _ZN3ccc8FF2x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF2x15y53efgEv
  virtual void  abc(); // _ZN3ccc8FF2x15y53abcEv
  ~FF2x15y5(); // tgen
  FF2x15y5(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y5E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF2x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y53pqrEv");}
void  ccc::FF2x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y53efgEv");}
void  ccc::FF2x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y53abcEv");}
ccc::FF2x15y5 ::~FF2x15y5(){ note_dtor("_ZN3ccc8FF2x15y5E", this);} // tgen
ccc::FF2x15y5 ::FF2x15y5(){ note_ctor("_ZN3ccc8FF2x15y5E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y5E, buf);
    ::ccc::FF2x15y5 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y5E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y5E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y5E);
    dp->::ccc::FF2x15y5::~FF2x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y5E(Test__ZN3ccc8FF2x15y5E, "_ZN3ccc8FF2x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y5C1Ev();
extern void _ZN3ccc8FF2x15y5D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y5E[] = {
  NSPAIR(_ZN3ccc8FF2x15y5C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y5E[];
extern void _ZN3ccc8FF2x15y53efgEv();
extern void _ZN3ccc8FF2x15y53abcEv();
extern void _ZN3ccc8FF2x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y5E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y5E[] = {
  {&(_ZTVN3ccc8FF2x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y5E[];
Class_Descriptor cd__ZN3ccc8FF2x15y5E = {  "_ZN3ccc8FF2x15y5E", // class name
  bases__ZN3ccc8FF2x15y5E, 2,
  &(vtc__ZN3ccc8FF2x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y5E),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
namespace ccc { 
struct  FF2x15y6  : virtual ::ccc::EE2x15 {
  virtual void  abc(); // _ZN3ccc8FF2x15y63abcEv
  virtual void  efg(); // _ZN3ccc8FF2x15y63efgEv
  ~FF2x15y6(); // tgen
  FF2x15y6(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y6E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y63abcEv");}
void  ccc::FF2x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y63efgEv");}
ccc::FF2x15y6 ::~FF2x15y6(){ note_dtor("_ZN3ccc8FF2x15y6E", this);} // tgen
ccc::FF2x15y6 ::FF2x15y6(){ note_ctor("_ZN3ccc8FF2x15y6E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y6E, buf);
    ::ccc::FF2x15y6 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y6E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y6E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y6E);
    dp->::ccc::FF2x15y6::~FF2x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y6E(Test__ZN3ccc8FF2x15y6E, "_ZN3ccc8FF2x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y6C1Ev();
extern void _ZN3ccc8FF2x15y6D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y6E[] = {
  NSPAIR(_ZN3ccc8FF2x15y6C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y6E[];
extern void _ZN3ccc8FF2x15y63efgEv();
extern void _ZN3ccc8FF2x15y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y6E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y6E[] = {
  {&(_ZTVN3ccc8FF2x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y6E[];
Class_Descriptor cd__ZN3ccc8FF2x15y6E = {  "_ZN3ccc8FF2x15y6E", // class name
  bases__ZN3ccc8FF2x15y6E, 2,
  &(vtc__ZN3ccc8FF2x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y6E),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
namespace ccc { 
struct  FF2x15y7  : virtual ::ccc::EE2x15 {
  virtual void  abc(); // _ZN3ccc8FF2x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y73pqrEv
  ~FF2x15y7(); // tgen
  FF2x15y7(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y7E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y73abcEv");}
void  ccc::FF2x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y73pqrEv");}
ccc::FF2x15y7 ::~FF2x15y7(){ note_dtor("_ZN3ccc8FF2x15y7E", this);} // tgen
ccc::FF2x15y7 ::FF2x15y7(){ note_ctor("_ZN3ccc8FF2x15y7E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y7E, buf);
    ::ccc::FF2x15y7 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y7E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y7E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y7E);
    dp->::ccc::FF2x15y7::~FF2x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y7E(Test__ZN3ccc8FF2x15y7E, "_ZN3ccc8FF2x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y7C1Ev();
extern void _ZN3ccc8FF2x15y7D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y7E[] = {
  NSPAIR(_ZN3ccc8FF2x15y7C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8FF2x15y73abcEv();
extern void _ZN3ccc8FF2x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y7E[] = {
  {&(_ZTVN3ccc8FF2x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y7E[];
Class_Descriptor cd__ZN3ccc8FF2x15y7E = {  "_ZN3ccc8FF2x15y7E", // class name
  bases__ZN3ccc8FF2x15y7E, 2,
  &(vtc__ZN3ccc8FF2x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y7E),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
namespace ccc { 
struct  FF2x15y8  : virtual ::ccc::EE2x15 {
  virtual void  efg(); // _ZN3ccc8FF2x15y83efgEv
  virtual void  abc(); // _ZN3ccc8FF2x15y83abcEv
  ~FF2x15y8(); // tgen
  FF2x15y8(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y8E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y83efgEv");}
void  ccc::FF2x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF2x15y83abcEv");}
ccc::FF2x15y8 ::~FF2x15y8(){ note_dtor("_ZN3ccc8FF2x15y8E", this);} // tgen
ccc::FF2x15y8 ::FF2x15y8(){ note_ctor("_ZN3ccc8FF2x15y8E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y8E, buf);
    ::ccc::FF2x15y8 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y8E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y8E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y8E);
    dp->::ccc::FF2x15y8::~FF2x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y8E(Test__ZN3ccc8FF2x15y8E, "_ZN3ccc8FF2x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y8C1Ev();
extern void _ZN3ccc8FF2x15y8D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y8E[] = {
  NSPAIR(_ZN3ccc8FF2x15y8C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y8E[];
extern void _ZN3ccc8FF2x15y83efgEv();
extern void _ZN3ccc8FF2x15y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y8E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y8E[] = {
  {&(_ZTVN3ccc8FF2x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y8E[];
Class_Descriptor cd__ZN3ccc8FF2x15y8E = {  "_ZN3ccc8FF2x15y8E", // class name
  bases__ZN3ccc8FF2x15y8E, 2,
  &(vtc__ZN3ccc8FF2x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y8E),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
namespace ccc { 
struct  FF2x15y9  : virtual ::ccc::EE2x15 {
  virtual void  efg(); // _ZN3ccc8FF2x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF2x15y93pqrEv
  ~FF2x15y9(); // tgen
  FF2x15y9(); // tgen
};
//SIG(1 _ZN3ccc8FF2x15y9E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF2x15y93efgEv");}
void  ccc::FF2x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF2x15y93pqrEv");}
ccc::FF2x15y9 ::~FF2x15y9(){ note_dtor("_ZN3ccc8FF2x15y9E", this);} // tgen
ccc::FF2x15y9 ::FF2x15y9(){ note_ctor("_ZN3ccc8FF2x15y9E", this);} // tgen
}
static void Test__ZN3ccc8FF2x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF2x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF2x15y9E, buf);
    ::ccc::FF2x15y9 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF2x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF2x15y9E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y9E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc8FF2x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF2x15y9E);
    dp->::ccc::FF2x15y9::~FF2x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF2x15y9E(Test__ZN3ccc8FF2x15y9E, "_ZN3ccc8FF2x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF2x15y9C1Ev();
extern void _ZN3ccc8FF2x15y9D1Ev();
Name_Map name_map__ZN3ccc8FF2x15y9E[] = {
  NSPAIR(_ZN3ccc8FF2x15y9C1Ev),
  NSPAIR(_ZN3ccc8FF2x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc8FF2x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y9E[];
extern void _ZN3ccc8FF2x15y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8FF2x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF2x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF2x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF2x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF2x15y9E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF2x15y9E[] = {
  {&(_ZTVN3ccc8FF2x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF2x15y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_8FF2x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF2x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF2x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF2x15y9E[];
Class_Descriptor cd__ZN3ccc8FF2x15y9E = {  "_ZN3ccc8FF2x15y9E", // class name
  bases__ZN3ccc8FF2x15y9E, 2,
  &(vtc__ZN3ccc8FF2x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF2x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF2x15y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF2x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF2x15y9E),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
namespace ccc { 
struct  FF2x15y10  : virtual ::ccc::EE2x15 {
  virtual void  pqr(); // _ZN3ccc9FF2x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF2x15y103abcEv
  ~FF2x15y10(); // tgen
  FF2x15y10(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y10E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x15y103pqrEv");}
void  ccc::FF2x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x15y103abcEv");}
ccc::FF2x15y10 ::~FF2x15y10(){ note_dtor("_ZN3ccc9FF2x15y10E", this);} // tgen
ccc::FF2x15y10 ::FF2x15y10(){ note_ctor("_ZN3ccc9FF2x15y10E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y10E, buf);
    ::ccc::FF2x15y10 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y10E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y10E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y10E);
    dp->::ccc::FF2x15y10::~FF2x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y10E(Test__ZN3ccc9FF2x15y10E, "_ZN3ccc9FF2x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y10C1Ev();
extern void _ZN3ccc9FF2x15y10D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y10E[] = {
  NSPAIR(_ZN3ccc9FF2x15y10C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x15y103abcEv();
extern void _ZN3ccc9FF2x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y10E[] = {
  {&(_ZTVN3ccc9FF2x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y10E[];
Class_Descriptor cd__ZN3ccc9FF2x15y10E = {  "_ZN3ccc9FF2x15y10E", // class name
  bases__ZN3ccc9FF2x15y10E, 2,
  &(vtc__ZN3ccc9FF2x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y10E),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
namespace ccc { 
struct  FF2x15y11  : virtual ::ccc::EE2x15 {
  virtual void  pqr(); // _ZN3ccc9FF2x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF2x15y113efgEv
  ~FF2x15y11(); // tgen
  FF2x15y11(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y11E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF2x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x15y113pqrEv");}
void  ccc::FF2x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x15y113efgEv");}
ccc::FF2x15y11 ::~FF2x15y11(){ note_dtor("_ZN3ccc9FF2x15y11E", this);} // tgen
ccc::FF2x15y11 ::FF2x15y11(){ note_ctor("_ZN3ccc9FF2x15y11E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y11E, buf);
    ::ccc::FF2x15y11 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y11E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y11E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y11E);
    dp->::ccc::FF2x15y11::~FF2x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y11E(Test__ZN3ccc9FF2x15y11E, "_ZN3ccc9FF2x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y11C1Ev();
extern void _ZN3ccc9FF2x15y11D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y11E[] = {
  NSPAIR(_ZN3ccc9FF2x15y11C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y11E[];
extern void _ZN3ccc9FF2x15y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y11E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y11E[] = {
  {&(_ZTVN3ccc9FF2x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y11E[];
Class_Descriptor cd__ZN3ccc9FF2x15y11E = {  "_ZN3ccc9FF2x15y11E", // class name
  bases__ZN3ccc9FF2x15y11E, 2,
  &(vtc__ZN3ccc9FF2x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y11E),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
namespace ccc { 
struct  FF2x15y12  : virtual ::ccc::EE2x15 {
  virtual void  abc(); // _ZN3ccc9FF2x15y123abcEv
  ~FF2x15y12(); // tgen
  FF2x15y12(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y12E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1}
}
namespace ccc { 
void  ccc::FF2x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF2x15y123abcEv");}
ccc::FF2x15y12 ::~FF2x15y12(){ note_dtor("_ZN3ccc9FF2x15y12E", this);} // tgen
ccc::FF2x15y12 ::FF2x15y12(){ note_ctor("_ZN3ccc9FF2x15y12E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y12E, buf);
    ::ccc::FF2x15y12 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y12E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y12E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y12E);
    dp->::ccc::FF2x15y12::~FF2x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y12E(Test__ZN3ccc9FF2x15y12E, "_ZN3ccc9FF2x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y12C1Ev();
extern void _ZN3ccc9FF2x15y12D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y12E[] = {
  NSPAIR(_ZN3ccc9FF2x15y12C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9FF2x15y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y12E[] = {
  {&(_ZTVN3ccc9FF2x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y12E[];
Class_Descriptor cd__ZN3ccc9FF2x15y12E = {  "_ZN3ccc9FF2x15y12E", // class name
  bases__ZN3ccc9FF2x15y12E, 2,
  &(vtc__ZN3ccc9FF2x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y12E),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
namespace ccc { 
struct  FF2x15y13  : virtual ::ccc::EE2x15 {
  virtual void  efg(); // _ZN3ccc9FF2x15y133efgEv
  ~FF2x15y13(); // tgen
  FF2x15y13(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y13E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1}
}
namespace ccc { 
void  ccc::FF2x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF2x15y133efgEv");}
ccc::FF2x15y13 ::~FF2x15y13(){ note_dtor("_ZN3ccc9FF2x15y13E", this);} // tgen
ccc::FF2x15y13 ::FF2x15y13(){ note_ctor("_ZN3ccc9FF2x15y13E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y13E, buf);
    ::ccc::FF2x15y13 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y13E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y13E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y13E);
    dp->::ccc::FF2x15y13::~FF2x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y13E(Test__ZN3ccc9FF2x15y13E, "_ZN3ccc9FF2x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y13C1Ev();
extern void _ZN3ccc9FF2x15y13D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y13E[] = {
  NSPAIR(_ZN3ccc9FF2x15y13C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y13E[];
extern void _ZN3ccc9FF2x15y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y13E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y13E[] = {
  {&(_ZTVN3ccc9FF2x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y13E[];
Class_Descriptor cd__ZN3ccc9FF2x15y13E = {  "_ZN3ccc9FF2x15y13E", // class name
  bases__ZN3ccc9FF2x15y13E, 2,
  &(vtc__ZN3ccc9FF2x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y13E),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
namespace ccc { 
struct  FF2x15y14  : virtual ::ccc::EE2x15 {
  virtual void  pqr(); // _ZN3ccc9FF2x15y143pqrEv
  ~FF2x15y14(); // tgen
  FF2x15y14(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y14E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1}
}
namespace ccc { 
void  ccc::FF2x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF2x15y143pqrEv");}
ccc::FF2x15y14 ::~FF2x15y14(){ note_dtor("_ZN3ccc9FF2x15y14E", this);} // tgen
ccc::FF2x15y14 ::FF2x15y14(){ note_ctor("_ZN3ccc9FF2x15y14E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y14E, buf);
    ::ccc::FF2x15y14 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y14E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y14E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y14E);
    dp->::ccc::FF2x15y14::~FF2x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y14E(Test__ZN3ccc9FF2x15y14E, "_ZN3ccc9FF2x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y14C1Ev();
extern void _ZN3ccc9FF2x15y14D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y14E[] = {
  NSPAIR(_ZN3ccc9FF2x15y14C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9FF2x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF2x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y14E[] = {
  {&(_ZTVN3ccc9FF2x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y14E[];
Class_Descriptor cd__ZN3ccc9FF2x15y14E = {  "_ZN3ccc9FF2x15y14E", // class name
  bases__ZN3ccc9FF2x15y14E, 2,
  &(vtc__ZN3ccc9FF2x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y14E),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
namespace ccc { 
struct  FF2x15y15  : virtual ::ccc::EE2x15 {
  ~FF2x15y15(); // tgen
  FF2x15y15(); // tgen
};
//SIG(1 _ZN3ccc9FF2x15y15E) C1{ VBC2{ VBC3{ v1 v2 v3}}}
}
namespace ccc { 
ccc::FF2x15y15 ::~FF2x15y15(){ note_dtor("_ZN3ccc9FF2x15y15E", this);} // tgen
ccc::FF2x15y15 ::FF2x15y15(){ note_ctor("_ZN3ccc9FF2x15y15E", this);} // tgen
}
static void Test__ZN3ccc9FF2x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF2x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF2x15y15E, buf);
    ::ccc::FF2x15y15 *dp, &lv = *(dp=new (buf) ::ccc::FF2x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF2x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF2x15y15E)");
    check_base_class_offset(lv, (::ccc::AA2*)(::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y15E");
    check_base_class_offset(lv, (::ccc::EE2x15*), 0, "_ZN3ccc9FF2x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF2x15y15E);
    dp->::ccc::FF2x15y15::~FF2x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF2x15y15E(Test__ZN3ccc9FF2x15y15E, "_ZN3ccc9FF2x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF2x15y15C1Ev();
extern void _ZN3ccc9FF2x15y15D1Ev();
Name_Map name_map__ZN3ccc9FF2x15y15E[] = {
  NSPAIR(_ZN3ccc9FF2x15y15C1Ev),
  NSPAIR(_ZN3ccc9FF2x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc6EE2x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE2x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE2x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE2x15E[];
static Base_Class bases__ZN3ccc9FF2x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE2x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF2x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF2x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF2x15y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE2x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF2x15y15E[] = {
  {&(_ZTVN3ccc9FF2x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF2x15y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE2x15E__NS_9FF2x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF2x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF2x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF2x15y15E[];
Class_Descriptor cd__ZN3ccc9FF2x15y15E = {  "_ZN3ccc9FF2x15y15E", // class name
  bases__ZN3ccc9FF2x15y15E, 2,
  &(vtc__ZN3ccc9FF2x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF2x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF2x15y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF2x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF2x15y15E),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
namespace ccc { 
struct  FF3x0y0  : virtual ::ccc::EE3x0 {
  virtual void  abc(); // _ZN3ccc7FF3x0y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y03pqrEv
  ~FF3x0y0(); // tgen
  FF3x0y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y03abcEv");}
void  ccc::FF3x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y03efgEv");}
void  ccc::FF3x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y03pqrEv");}
ccc::FF3x0y0 ::~FF3x0y0(){ note_dtor("_ZN3ccc7FF3x0y0E", this);} // tgen
ccc::FF3x0y0 ::FF3x0y0(){ note_ctor("_ZN3ccc7FF3x0y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y0E, buf);
    ::ccc::FF3x0y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y0E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y0E);
    dp->::ccc::FF3x0y0::~FF3x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y0E(Test__ZN3ccc7FF3x0y0E, "_ZN3ccc7FF3x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y0C1Ev();
extern void _ZN3ccc7FF3x0y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y0E[] = {
  NSPAIR(_ZN3ccc7FF3x0y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y0E[];
extern void _ZN3ccc7FF3x0y03efgEv();
extern void _ZN3ccc7FF3x0y03pqrEv();
extern void _ZN3ccc7FF3x0y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y0E[] = {
  {&(_ZTVN3ccc7FF3x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y0E[];
static VTBL_ENTRY alt_thunk_names721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y0E = {  "_ZN3ccc7FF3x0y0E", // class name
  bases__ZN3ccc7FF3x0y0E, 2,
  &(vtc__ZN3ccc7FF3x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names721,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y1  : virtual ::ccc::EE3x0 {
  virtual void  abc(); // _ZN3ccc7FF3x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x0y13efgEv
  ~FF3x0y1(); // tgen
  FF3x0y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y13abcEv");}
void  ccc::FF3x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y13pqrEv");}
void  ccc::FF3x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y13efgEv");}
ccc::FF3x0y1 ::~FF3x0y1(){ note_dtor("_ZN3ccc7FF3x0y1E", this);} // tgen
ccc::FF3x0y1 ::FF3x0y1(){ note_ctor("_ZN3ccc7FF3x0y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y1E, buf);
    ::ccc::FF3x0y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y1E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y1E);
    dp->::ccc::FF3x0y1::~FF3x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y1E(Test__ZN3ccc7FF3x0y1E, "_ZN3ccc7FF3x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y1C1Ev();
extern void _ZN3ccc7FF3x0y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y1E[] = {
  NSPAIR(_ZN3ccc7FF3x0y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y1E[];
extern void _ZN3ccc7FF3x0y13efgEv();
extern void _ZN3ccc7FF3x0y13pqrEv();
extern void _ZN3ccc7FF3x0y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y1E[] = {
  {&(_ZTVN3ccc7FF3x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y1E[];
static VTBL_ENTRY alt_thunk_names722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y1E = {  "_ZN3ccc7FF3x0y1E", // class name
  bases__ZN3ccc7FF3x0y1E, 2,
  &(vtc__ZN3ccc7FF3x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names722,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y2  : virtual ::ccc::EE3x0 {
  virtual void  efg(); // _ZN3ccc7FF3x0y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y23pqrEv
  ~FF3x0y2(); // tgen
  FF3x0y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y23efgEv");}
void  ccc::FF3x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y23abcEv");}
void  ccc::FF3x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y23pqrEv");}
ccc::FF3x0y2 ::~FF3x0y2(){ note_dtor("_ZN3ccc7FF3x0y2E", this);} // tgen
ccc::FF3x0y2 ::FF3x0y2(){ note_ctor("_ZN3ccc7FF3x0y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y2E, buf);
    ::ccc::FF3x0y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y2E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y2E);
    dp->::ccc::FF3x0y2::~FF3x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y2E(Test__ZN3ccc7FF3x0y2E, "_ZN3ccc7FF3x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y2C1Ev();
extern void _ZN3ccc7FF3x0y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y2E[] = {
  NSPAIR(_ZN3ccc7FF3x0y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y2E[];
extern void _ZN3ccc7FF3x0y23efgEv();
extern void _ZN3ccc7FF3x0y23pqrEv();
extern void _ZN3ccc7FF3x0y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y2E[] = {
  {&(_ZTVN3ccc7FF3x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y2E[];
static VTBL_ENTRY alt_thunk_names723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y2E = {  "_ZN3ccc7FF3x0y2E", // class name
  bases__ZN3ccc7FF3x0y2E, 2,
  &(vtc__ZN3ccc7FF3x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names723,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y3  : virtual ::ccc::EE3x0 {
  virtual void  efg(); // _ZN3ccc7FF3x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x0y33abcEv
  ~FF3x0y3(); // tgen
  FF3x0y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y33efgEv");}
void  ccc::FF3x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y33pqrEv");}
void  ccc::FF3x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y33abcEv");}
ccc::FF3x0y3 ::~FF3x0y3(){ note_dtor("_ZN3ccc7FF3x0y3E", this);} // tgen
ccc::FF3x0y3 ::FF3x0y3(){ note_ctor("_ZN3ccc7FF3x0y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y3E, buf);
    ::ccc::FF3x0y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y3E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y3E);
    dp->::ccc::FF3x0y3::~FF3x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y3E(Test__ZN3ccc7FF3x0y3E, "_ZN3ccc7FF3x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y3C1Ev();
extern void _ZN3ccc7FF3x0y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y3E[] = {
  NSPAIR(_ZN3ccc7FF3x0y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y3E[];
extern void _ZN3ccc7FF3x0y33efgEv();
extern void _ZN3ccc7FF3x0y33pqrEv();
extern void _ZN3ccc7FF3x0y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y3E[] = {
  {&(_ZTVN3ccc7FF3x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y3E[];
static VTBL_ENTRY alt_thunk_names724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y3E = {  "_ZN3ccc7FF3x0y3E", // class name
  bases__ZN3ccc7FF3x0y3E, 2,
  &(vtc__ZN3ccc7FF3x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names724,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y4  : virtual ::ccc::EE3x0 {
  virtual void  pqr(); // _ZN3ccc7FF3x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x0y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x0y43efgEv
  ~FF3x0y4(); // tgen
  FF3x0y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y43pqrEv");}
void  ccc::FF3x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y43abcEv");}
void  ccc::FF3x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y43efgEv");}
ccc::FF3x0y4 ::~FF3x0y4(){ note_dtor("_ZN3ccc7FF3x0y4E", this);} // tgen
ccc::FF3x0y4 ::FF3x0y4(){ note_ctor("_ZN3ccc7FF3x0y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y4E, buf);
    ::ccc::FF3x0y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y4E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y4E);
    dp->::ccc::FF3x0y4::~FF3x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y4E(Test__ZN3ccc7FF3x0y4E, "_ZN3ccc7FF3x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y4C1Ev();
extern void _ZN3ccc7FF3x0y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y4E[] = {
  NSPAIR(_ZN3ccc7FF3x0y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y4E[];
extern void _ZN3ccc7FF3x0y43efgEv();
extern void _ZN3ccc7FF3x0y43pqrEv();
extern void _ZN3ccc7FF3x0y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y4E[] = {
  {&(_ZTVN3ccc7FF3x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y4E[];
static VTBL_ENTRY alt_thunk_names725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y4E = {  "_ZN3ccc7FF3x0y4E", // class name
  bases__ZN3ccc7FF3x0y4E, 2,
  &(vtc__ZN3ccc7FF3x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names725,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y5  : virtual ::ccc::EE3x0 {
  virtual void  pqr(); // _ZN3ccc7FF3x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x0y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x0y53abcEv
  ~FF3x0y5(); // tgen
  FF3x0y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y53pqrEv");}
void  ccc::FF3x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y53efgEv");}
void  ccc::FF3x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y53abcEv");}
ccc::FF3x0y5 ::~FF3x0y5(){ note_dtor("_ZN3ccc7FF3x0y5E", this);} // tgen
ccc::FF3x0y5 ::FF3x0y5(){ note_ctor("_ZN3ccc7FF3x0y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y5E, buf);
    ::ccc::FF3x0y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y5E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y5E);
    dp->::ccc::FF3x0y5::~FF3x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y5E(Test__ZN3ccc7FF3x0y5E, "_ZN3ccc7FF3x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y5C1Ev();
extern void _ZN3ccc7FF3x0y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y5E[] = {
  NSPAIR(_ZN3ccc7FF3x0y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y5E[];
extern void _ZN3ccc7FF3x0y53efgEv();
extern void _ZN3ccc7FF3x0y53pqrEv();
extern void _ZN3ccc7FF3x0y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y5E[] = {
  {&(_ZTVN3ccc7FF3x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y5E[];
static VTBL_ENTRY alt_thunk_names726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y5E = {  "_ZN3ccc7FF3x0y5E", // class name
  bases__ZN3ccc7FF3x0y5E, 2,
  &(vtc__ZN3ccc7FF3x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names726,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y6  : virtual ::ccc::EE3x0 {
  virtual void  abc(); // _ZN3ccc7FF3x0y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x0y63efgEv
  ~FF3x0y6(); // tgen
  FF3x0y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y63abcEv");}
void  ccc::FF3x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y63efgEv");}
ccc::FF3x0y6 ::~FF3x0y6(){ note_dtor("_ZN3ccc7FF3x0y6E", this);} // tgen
ccc::FF3x0y6 ::FF3x0y6(){ note_ctor("_ZN3ccc7FF3x0y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y6E, buf);
    ::ccc::FF3x0y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y6E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y6E);
    dp->::ccc::FF3x0y6::~FF3x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y6E(Test__ZN3ccc7FF3x0y6E, "_ZN3ccc7FF3x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y6C1Ev();
extern void _ZN3ccc7FF3x0y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y6E[] = {
  NSPAIR(_ZN3ccc7FF3x0y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y6E[];
extern void _ZN3ccc7FF3x0y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x0y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y6E[] = {
  {&(_ZTVN3ccc7FF3x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y6E[];
static VTBL_ENTRY alt_thunk_names727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y6E = {  "_ZN3ccc7FF3x0y6E", // class name
  bases__ZN3ccc7FF3x0y6E, 2,
  &(vtc__ZN3ccc7FF3x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names727,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y7  : virtual ::ccc::EE3x0 {
  virtual void  abc(); // _ZN3ccc7FF3x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y73pqrEv
  ~FF3x0y7(); // tgen
  FF3x0y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y73abcEv");}
void  ccc::FF3x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y73pqrEv");}
ccc::FF3x0y7 ::~FF3x0y7(){ note_dtor("_ZN3ccc7FF3x0y7E", this);} // tgen
ccc::FF3x0y7 ::FF3x0y7(){ note_ctor("_ZN3ccc7FF3x0y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y7E, buf);
    ::ccc::FF3x0y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y7E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y7E);
    dp->::ccc::FF3x0y7::~FF3x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y7E(Test__ZN3ccc7FF3x0y7E, "_ZN3ccc7FF3x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y7C1Ev();
extern void _ZN3ccc7FF3x0y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y7E[] = {
  NSPAIR(_ZN3ccc7FF3x0y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x0y73pqrEv();
extern void _ZN3ccc7FF3x0y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y7E[] = {
  {&(_ZTVN3ccc7FF3x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y7E[];
static VTBL_ENTRY alt_thunk_names728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y7E = {  "_ZN3ccc7FF3x0y7E", // class name
  bases__ZN3ccc7FF3x0y7E, 2,
  &(vtc__ZN3ccc7FF3x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names728,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y8  : virtual ::ccc::EE3x0 {
  virtual void  efg(); // _ZN3ccc7FF3x0y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x0y83abcEv
  ~FF3x0y8(); // tgen
  FF3x0y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y83efgEv");}
void  ccc::FF3x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x0y83abcEv");}
ccc::FF3x0y8 ::~FF3x0y8(){ note_dtor("_ZN3ccc7FF3x0y8E", this);} // tgen
ccc::FF3x0y8 ::FF3x0y8(){ note_ctor("_ZN3ccc7FF3x0y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y8E, buf);
    ::ccc::FF3x0y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y8E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y8E);
    dp->::ccc::FF3x0y8::~FF3x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y8E(Test__ZN3ccc7FF3x0y8E, "_ZN3ccc7FF3x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y8C1Ev();
extern void _ZN3ccc7FF3x0y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y8E[] = {
  NSPAIR(_ZN3ccc7FF3x0y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y8E[];
extern void _ZN3ccc7FF3x0y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x0y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y8E[] = {
  {&(_ZTVN3ccc7FF3x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y8E[];
static VTBL_ENTRY alt_thunk_names729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y8E = {  "_ZN3ccc7FF3x0y8E", // class name
  bases__ZN3ccc7FF3x0y8E, 2,
  &(vtc__ZN3ccc7FF3x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names729,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y9  : virtual ::ccc::EE3x0 {
  virtual void  efg(); // _ZN3ccc7FF3x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x0y93pqrEv
  ~FF3x0y9(); // tgen
  FF3x0y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x0y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x0y93efgEv");}
void  ccc::FF3x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x0y93pqrEv");}
ccc::FF3x0y9 ::~FF3x0y9(){ note_dtor("_ZN3ccc7FF3x0y9E", this);} // tgen
ccc::FF3x0y9 ::FF3x0y9(){ note_ctor("_ZN3ccc7FF3x0y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x0y9E, buf);
    ::ccc::FF3x0y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x0y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y9E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc7FF3x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x0y9E);
    dp->::ccc::FF3x0y9::~FF3x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x0y9E(Test__ZN3ccc7FF3x0y9E, "_ZN3ccc7FF3x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x0y9C1Ev();
extern void _ZN3ccc7FF3x0y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x0y9E[] = {
  NSPAIR(_ZN3ccc7FF3x0y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc7FF3x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y9E[];
extern void _ZN3ccc7FF3x0y93efgEv();
extern void _ZN3ccc7FF3x0y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x0y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x0y9E[] = {
  {&(_ZTVN3ccc7FF3x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x0y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_7FF3x0y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x0y9E[];
static VTBL_ENTRY alt_thunk_names730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x0y9E = {  "_ZN3ccc7FF3x0y9E", // class name
  bases__ZN3ccc7FF3x0y9E, 2,
  &(vtc__ZN3ccc7FF3x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x0y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x0y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x0y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x0y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names730,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y10  : virtual ::ccc::EE3x0 {
  virtual void  pqr(); // _ZN3ccc8FF3x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x0y103abcEv
  ~FF3x0y10(); // tgen
  FF3x0y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x0y103pqrEv");}
void  ccc::FF3x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x0y103abcEv");}
ccc::FF3x0y10 ::~FF3x0y10(){ note_dtor("_ZN3ccc8FF3x0y10E", this);} // tgen
ccc::FF3x0y10 ::FF3x0y10(){ note_ctor("_ZN3ccc8FF3x0y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y10E, buf);
    ::ccc::FF3x0y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y10E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y10E);
    dp->::ccc::FF3x0y10::~FF3x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y10E(Test__ZN3ccc8FF3x0y10E, "_ZN3ccc8FF3x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y10C1Ev();
extern void _ZN3ccc8FF3x0y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y10E[] = {
  NSPAIR(_ZN3ccc8FF3x0y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x0y103pqrEv();
extern void _ZN3ccc8FF3x0y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y10E[] = {
  {&(_ZTVN3ccc8FF3x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y10E[];
static VTBL_ENTRY alt_thunk_names731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y10E = {  "_ZN3ccc8FF3x0y10E", // class name
  bases__ZN3ccc8FF3x0y10E, 2,
  &(vtc__ZN3ccc8FF3x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names731,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y11  : virtual ::ccc::EE3x0 {
  virtual void  pqr(); // _ZN3ccc8FF3x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x0y113efgEv
  ~FF3x0y11(); // tgen
  FF3x0y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x0y113pqrEv");}
void  ccc::FF3x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x0y113efgEv");}
ccc::FF3x0y11 ::~FF3x0y11(){ note_dtor("_ZN3ccc8FF3x0y11E", this);} // tgen
ccc::FF3x0y11 ::FF3x0y11(){ note_ctor("_ZN3ccc8FF3x0y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y11E, buf);
    ::ccc::FF3x0y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y11E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y11E);
    dp->::ccc::FF3x0y11::~FF3x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y11E(Test__ZN3ccc8FF3x0y11E, "_ZN3ccc8FF3x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y11C1Ev();
extern void _ZN3ccc8FF3x0y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y11E[] = {
  NSPAIR(_ZN3ccc8FF3x0y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y11E[];
extern void _ZN3ccc8FF3x0y113efgEv();
extern void _ZN3ccc8FF3x0y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y11E[] = {
  {&(_ZTVN3ccc8FF3x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y11E[];
static VTBL_ENTRY alt_thunk_names732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y11E = {  "_ZN3ccc8FF3x0y11E", // class name
  bases__ZN3ccc8FF3x0y11E, 2,
  &(vtc__ZN3ccc8FF3x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names732,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y12  : virtual ::ccc::EE3x0 {
  virtual void  abc(); // _ZN3ccc8FF3x0y123abcEv
  ~FF3x0y12(); // tgen
  FF3x0y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x0y123abcEv");}
ccc::FF3x0y12 ::~FF3x0y12(){ note_dtor("_ZN3ccc8FF3x0y12E", this);} // tgen
ccc::FF3x0y12 ::FF3x0y12(){ note_ctor("_ZN3ccc8FF3x0y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y12E, buf);
    ::ccc::FF3x0y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y12E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y12E);
    dp->::ccc::FF3x0y12::~FF3x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y12E(Test__ZN3ccc8FF3x0y12E, "_ZN3ccc8FF3x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y12C1Ev();
extern void _ZN3ccc8FF3x0y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y12E[] = {
  NSPAIR(_ZN3ccc8FF3x0y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x0y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y12E[] = {
  {&(_ZTVN3ccc8FF3x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y12E[];
static VTBL_ENTRY alt_thunk_names733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y12E = {  "_ZN3ccc8FF3x0y12E", // class name
  bases__ZN3ccc8FF3x0y12E, 2,
  &(vtc__ZN3ccc8FF3x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names733,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y13  : virtual ::ccc::EE3x0 {
  virtual void  efg(); // _ZN3ccc8FF3x0y133efgEv
  ~FF3x0y13(); // tgen
  FF3x0y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x0y133efgEv");}
ccc::FF3x0y13 ::~FF3x0y13(){ note_dtor("_ZN3ccc8FF3x0y13E", this);} // tgen
ccc::FF3x0y13 ::FF3x0y13(){ note_ctor("_ZN3ccc8FF3x0y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y13E, buf);
    ::ccc::FF3x0y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y13E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y13E);
    dp->::ccc::FF3x0y13::~FF3x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y13E(Test__ZN3ccc8FF3x0y13E, "_ZN3ccc8FF3x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y13C1Ev();
extern void _ZN3ccc8FF3x0y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y13E[] = {
  NSPAIR(_ZN3ccc8FF3x0y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y13E[];
extern void _ZN3ccc8FF3x0y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y13E[] = {
  {&(_ZTVN3ccc8FF3x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y13E[];
static VTBL_ENTRY alt_thunk_names734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y13E = {  "_ZN3ccc8FF3x0y13E", // class name
  bases__ZN3ccc8FF3x0y13E, 2,
  &(vtc__ZN3ccc8FF3x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names734,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y14  : virtual ::ccc::EE3x0 {
  virtual void  pqr(); // _ZN3ccc8FF3x0y143pqrEv
  ~FF3x0y14(); // tgen
  FF3x0y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x0y143pqrEv");}
ccc::FF3x0y14 ::~FF3x0y14(){ note_dtor("_ZN3ccc8FF3x0y14E", this);} // tgen
ccc::FF3x0y14 ::FF3x0y14(){ note_ctor("_ZN3ccc8FF3x0y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y14E, buf);
    ::ccc::FF3x0y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y14E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y14E);
    dp->::ccc::FF3x0y14::~FF3x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y14E(Test__ZN3ccc8FF3x0y14E, "_ZN3ccc8FF3x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y14C1Ev();
extern void _ZN3ccc8FF3x0y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y14E[] = {
  NSPAIR(_ZN3ccc8FF3x0y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x0y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x0y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y14E[] = {
  {&(_ZTVN3ccc8FF3x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y14E[];
static VTBL_ENTRY alt_thunk_names735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y14E = {  "_ZN3ccc8FF3x0y14E", // class name
  bases__ZN3ccc8FF3x0y14E, 2,
  &(vtc__ZN3ccc8FF3x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names735,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x0y15  : virtual ::ccc::EE3x0 {
  ~FF3x0y15(); // tgen
  FF3x0y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x0y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x0y15 ::~FF3x0y15(){ note_dtor("_ZN3ccc8FF3x0y15E", this);} // tgen
ccc::FF3x0y15 ::FF3x0y15(){ note_ctor("_ZN3ccc8FF3x0y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x0y15E, buf);
    ::ccc::FF3x0y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x0y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y15E");
    check_base_class_offset(lv, (::ccc::EE3x0*), 0, "_ZN3ccc8FF3x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x0y15E);
    dp->::ccc::FF3x0y15::~FF3x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x0y15E(Test__ZN3ccc8FF3x0y15E, "_ZN3ccc8FF3x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x0y15C1Ev();
extern void _ZN3ccc8FF3x0y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x0y15E[] = {
  NSPAIR(_ZN3ccc8FF3x0y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x0E[];
static Base_Class bases__ZN3ccc8FF3x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x0y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv)();
extern void _ZN3ccc5EE3x03efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv)();
extern void _ZN3ccc5EE3x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv)();
extern void _ZN3ccc5EE3x03abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x0y15E[] = {
  {&(_ZTVN3ccc8FF3x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x0y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x0E__NS_8FF3x0y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x0y15E[];
static VTBL_ENTRY alt_thunk_names736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x03abcEv,_ZTv0_n20_N3ccc5EE3x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x03pqrEv,_ZTv0_n16_N3ccc5EE3x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x03efgEv,_ZTv0_n12_N3ccc5EE3x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x0y15E = {  "_ZN3ccc8FF3x0y15E", // class name
  bases__ZN3ccc8FF3x0y15E, 2,
  &(vtc__ZN3ccc8FF3x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x0y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x0y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x0y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x0y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names736,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y0  : virtual ::ccc::EE3x1 {
  virtual void  abc(); // _ZN3ccc7FF3x1y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y03pqrEv
  ~FF3x1y0(); // tgen
  FF3x1y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y03abcEv");}
void  ccc::FF3x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y03efgEv");}
void  ccc::FF3x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y03pqrEv");}
ccc::FF3x1y0 ::~FF3x1y0(){ note_dtor("_ZN3ccc7FF3x1y0E", this);} // tgen
ccc::FF3x1y0 ::FF3x1y0(){ note_ctor("_ZN3ccc7FF3x1y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y0E, buf);
    ::ccc::FF3x1y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y0E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y0E);
    dp->::ccc::FF3x1y0::~FF3x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y0E(Test__ZN3ccc7FF3x1y0E, "_ZN3ccc7FF3x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y0C1Ev();
extern void _ZN3ccc7FF3x1y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y0E[] = {
  NSPAIR(_ZN3ccc7FF3x1y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y0E[];
extern void _ZN3ccc7FF3x1y03efgEv();
extern void _ZN3ccc7FF3x1y03pqrEv();
extern void _ZN3ccc7FF3x1y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y0E[] = {
  {&(_ZTVN3ccc7FF3x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y0E[];
static VTBL_ENTRY alt_thunk_names737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y0E = {  "_ZN3ccc7FF3x1y0E", // class name
  bases__ZN3ccc7FF3x1y0E, 2,
  &(vtc__ZN3ccc7FF3x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names737,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y1  : virtual ::ccc::EE3x1 {
  virtual void  abc(); // _ZN3ccc7FF3x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x1y13efgEv
  ~FF3x1y1(); // tgen
  FF3x1y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y13abcEv");}
void  ccc::FF3x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y13pqrEv");}
void  ccc::FF3x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y13efgEv");}
ccc::FF3x1y1 ::~FF3x1y1(){ note_dtor("_ZN3ccc7FF3x1y1E", this);} // tgen
ccc::FF3x1y1 ::FF3x1y1(){ note_ctor("_ZN3ccc7FF3x1y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y1E, buf);
    ::ccc::FF3x1y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y1E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y1E);
    dp->::ccc::FF3x1y1::~FF3x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y1E(Test__ZN3ccc7FF3x1y1E, "_ZN3ccc7FF3x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y1C1Ev();
extern void _ZN3ccc7FF3x1y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y1E[] = {
  NSPAIR(_ZN3ccc7FF3x1y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y1E[];
extern void _ZN3ccc7FF3x1y13efgEv();
extern void _ZN3ccc7FF3x1y13pqrEv();
extern void _ZN3ccc7FF3x1y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y1E[] = {
  {&(_ZTVN3ccc7FF3x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y1E[];
static VTBL_ENTRY alt_thunk_names738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y1E = {  "_ZN3ccc7FF3x1y1E", // class name
  bases__ZN3ccc7FF3x1y1E, 2,
  &(vtc__ZN3ccc7FF3x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names738,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y2  : virtual ::ccc::EE3x1 {
  virtual void  efg(); // _ZN3ccc7FF3x1y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y23pqrEv
  ~FF3x1y2(); // tgen
  FF3x1y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y23efgEv");}
void  ccc::FF3x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y23abcEv");}
void  ccc::FF3x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y23pqrEv");}
ccc::FF3x1y2 ::~FF3x1y2(){ note_dtor("_ZN3ccc7FF3x1y2E", this);} // tgen
ccc::FF3x1y2 ::FF3x1y2(){ note_ctor("_ZN3ccc7FF3x1y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y2E, buf);
    ::ccc::FF3x1y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y2E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y2E);
    dp->::ccc::FF3x1y2::~FF3x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y2E(Test__ZN3ccc7FF3x1y2E, "_ZN3ccc7FF3x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y2C1Ev();
extern void _ZN3ccc7FF3x1y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y2E[] = {
  NSPAIR(_ZN3ccc7FF3x1y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y2E[];
extern void _ZN3ccc7FF3x1y23efgEv();
extern void _ZN3ccc7FF3x1y23pqrEv();
extern void _ZN3ccc7FF3x1y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y2E[] = {
  {&(_ZTVN3ccc7FF3x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y2E[];
static VTBL_ENTRY alt_thunk_names739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y2E = {  "_ZN3ccc7FF3x1y2E", // class name
  bases__ZN3ccc7FF3x1y2E, 2,
  &(vtc__ZN3ccc7FF3x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names739,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y3  : virtual ::ccc::EE3x1 {
  virtual void  efg(); // _ZN3ccc7FF3x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x1y33abcEv
  ~FF3x1y3(); // tgen
  FF3x1y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y33efgEv");}
void  ccc::FF3x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y33pqrEv");}
void  ccc::FF3x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y33abcEv");}
ccc::FF3x1y3 ::~FF3x1y3(){ note_dtor("_ZN3ccc7FF3x1y3E", this);} // tgen
ccc::FF3x1y3 ::FF3x1y3(){ note_ctor("_ZN3ccc7FF3x1y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y3E, buf);
    ::ccc::FF3x1y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y3E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y3E);
    dp->::ccc::FF3x1y3::~FF3x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y3E(Test__ZN3ccc7FF3x1y3E, "_ZN3ccc7FF3x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y3C1Ev();
extern void _ZN3ccc7FF3x1y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y3E[] = {
  NSPAIR(_ZN3ccc7FF3x1y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y3E[];
extern void _ZN3ccc7FF3x1y33efgEv();
extern void _ZN3ccc7FF3x1y33pqrEv();
extern void _ZN3ccc7FF3x1y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y3E[] = {
  {&(_ZTVN3ccc7FF3x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y3E[];
static VTBL_ENTRY alt_thunk_names740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y3E = {  "_ZN3ccc7FF3x1y3E", // class name
  bases__ZN3ccc7FF3x1y3E, 2,
  &(vtc__ZN3ccc7FF3x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names740,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y4  : virtual ::ccc::EE3x1 {
  virtual void  pqr(); // _ZN3ccc7FF3x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x1y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x1y43efgEv
  ~FF3x1y4(); // tgen
  FF3x1y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y43pqrEv");}
void  ccc::FF3x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y43abcEv");}
void  ccc::FF3x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y43efgEv");}
ccc::FF3x1y4 ::~FF3x1y4(){ note_dtor("_ZN3ccc7FF3x1y4E", this);} // tgen
ccc::FF3x1y4 ::FF3x1y4(){ note_ctor("_ZN3ccc7FF3x1y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y4E, buf);
    ::ccc::FF3x1y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y4E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y4E);
    dp->::ccc::FF3x1y4::~FF3x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y4E(Test__ZN3ccc7FF3x1y4E, "_ZN3ccc7FF3x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y4C1Ev();
extern void _ZN3ccc7FF3x1y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y4E[] = {
  NSPAIR(_ZN3ccc7FF3x1y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y4E[];
extern void _ZN3ccc7FF3x1y43efgEv();
extern void _ZN3ccc7FF3x1y43pqrEv();
extern void _ZN3ccc7FF3x1y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y4E[] = {
  {&(_ZTVN3ccc7FF3x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y4E[];
static VTBL_ENTRY alt_thunk_names741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y4E = {  "_ZN3ccc7FF3x1y4E", // class name
  bases__ZN3ccc7FF3x1y4E, 2,
  &(vtc__ZN3ccc7FF3x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names741,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y5  : virtual ::ccc::EE3x1 {
  virtual void  pqr(); // _ZN3ccc7FF3x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x1y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x1y53abcEv
  ~FF3x1y5(); // tgen
  FF3x1y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y53pqrEv");}
void  ccc::FF3x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y53efgEv");}
void  ccc::FF3x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y53abcEv");}
ccc::FF3x1y5 ::~FF3x1y5(){ note_dtor("_ZN3ccc7FF3x1y5E", this);} // tgen
ccc::FF3x1y5 ::FF3x1y5(){ note_ctor("_ZN3ccc7FF3x1y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y5E, buf);
    ::ccc::FF3x1y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y5E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y5E);
    dp->::ccc::FF3x1y5::~FF3x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y5E(Test__ZN3ccc7FF3x1y5E, "_ZN3ccc7FF3x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y5C1Ev();
extern void _ZN3ccc7FF3x1y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y5E[] = {
  NSPAIR(_ZN3ccc7FF3x1y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y5E[];
extern void _ZN3ccc7FF3x1y53efgEv();
extern void _ZN3ccc7FF3x1y53pqrEv();
extern void _ZN3ccc7FF3x1y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y5E[] = {
  {&(_ZTVN3ccc7FF3x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y5E[];
static VTBL_ENTRY alt_thunk_names742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y5E = {  "_ZN3ccc7FF3x1y5E", // class name
  bases__ZN3ccc7FF3x1y5E, 2,
  &(vtc__ZN3ccc7FF3x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names742,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y6  : virtual ::ccc::EE3x1 {
  virtual void  abc(); // _ZN3ccc7FF3x1y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x1y63efgEv
  ~FF3x1y6(); // tgen
  FF3x1y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y63abcEv");}
void  ccc::FF3x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y63efgEv");}
ccc::FF3x1y6 ::~FF3x1y6(){ note_dtor("_ZN3ccc7FF3x1y6E", this);} // tgen
ccc::FF3x1y6 ::FF3x1y6(){ note_ctor("_ZN3ccc7FF3x1y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y6E, buf);
    ::ccc::FF3x1y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y6E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y6E);
    dp->::ccc::FF3x1y6::~FF3x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y6E(Test__ZN3ccc7FF3x1y6E, "_ZN3ccc7FF3x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y6C1Ev();
extern void _ZN3ccc7FF3x1y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y6E[] = {
  NSPAIR(_ZN3ccc7FF3x1y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y6E[];
extern void _ZN3ccc7FF3x1y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x1y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y6E[] = {
  {&(_ZTVN3ccc7FF3x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y6E[];
static VTBL_ENTRY alt_thunk_names743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y6E = {  "_ZN3ccc7FF3x1y6E", // class name
  bases__ZN3ccc7FF3x1y6E, 2,
  &(vtc__ZN3ccc7FF3x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names743,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y7  : virtual ::ccc::EE3x1 {
  virtual void  abc(); // _ZN3ccc7FF3x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y73pqrEv
  ~FF3x1y7(); // tgen
  FF3x1y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y73abcEv");}
void  ccc::FF3x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y73pqrEv");}
ccc::FF3x1y7 ::~FF3x1y7(){ note_dtor("_ZN3ccc7FF3x1y7E", this);} // tgen
ccc::FF3x1y7 ::FF3x1y7(){ note_ctor("_ZN3ccc7FF3x1y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y7E, buf);
    ::ccc::FF3x1y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y7E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y7E);
    dp->::ccc::FF3x1y7::~FF3x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y7E(Test__ZN3ccc7FF3x1y7E, "_ZN3ccc7FF3x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y7C1Ev();
extern void _ZN3ccc7FF3x1y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y7E[] = {
  NSPAIR(_ZN3ccc7FF3x1y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x1y73pqrEv();
extern void _ZN3ccc7FF3x1y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y7E[] = {
  {&(_ZTVN3ccc7FF3x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y7E[];
static VTBL_ENTRY alt_thunk_names744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y7E = {  "_ZN3ccc7FF3x1y7E", // class name
  bases__ZN3ccc7FF3x1y7E, 2,
  &(vtc__ZN3ccc7FF3x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names744,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y8  : virtual ::ccc::EE3x1 {
  virtual void  efg(); // _ZN3ccc7FF3x1y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x1y83abcEv
  ~FF3x1y8(); // tgen
  FF3x1y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y83efgEv");}
void  ccc::FF3x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x1y83abcEv");}
ccc::FF3x1y8 ::~FF3x1y8(){ note_dtor("_ZN3ccc7FF3x1y8E", this);} // tgen
ccc::FF3x1y8 ::FF3x1y8(){ note_ctor("_ZN3ccc7FF3x1y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y8E, buf);
    ::ccc::FF3x1y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y8E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y8E);
    dp->::ccc::FF3x1y8::~FF3x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y8E(Test__ZN3ccc7FF3x1y8E, "_ZN3ccc7FF3x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y8C1Ev();
extern void _ZN3ccc7FF3x1y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y8E[] = {
  NSPAIR(_ZN3ccc7FF3x1y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y8E[];
extern void _ZN3ccc7FF3x1y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x1y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y8E[] = {
  {&(_ZTVN3ccc7FF3x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y8E[];
static VTBL_ENTRY alt_thunk_names745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y8E = {  "_ZN3ccc7FF3x1y8E", // class name
  bases__ZN3ccc7FF3x1y8E, 2,
  &(vtc__ZN3ccc7FF3x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names745,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y9  : virtual ::ccc::EE3x1 {
  virtual void  efg(); // _ZN3ccc7FF3x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x1y93pqrEv
  ~FF3x1y9(); // tgen
  FF3x1y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x1y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x1y93efgEv");}
void  ccc::FF3x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x1y93pqrEv");}
ccc::FF3x1y9 ::~FF3x1y9(){ note_dtor("_ZN3ccc7FF3x1y9E", this);} // tgen
ccc::FF3x1y9 ::FF3x1y9(){ note_ctor("_ZN3ccc7FF3x1y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x1y9E, buf);
    ::ccc::FF3x1y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x1y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y9E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc7FF3x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x1y9E);
    dp->::ccc::FF3x1y9::~FF3x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x1y9E(Test__ZN3ccc7FF3x1y9E, "_ZN3ccc7FF3x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x1y9C1Ev();
extern void _ZN3ccc7FF3x1y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x1y9E[] = {
  NSPAIR(_ZN3ccc7FF3x1y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc7FF3x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y9E[];
extern void _ZN3ccc7FF3x1y93efgEv();
extern void _ZN3ccc7FF3x1y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x1y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x1y9E[] = {
  {&(_ZTVN3ccc7FF3x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x1y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_7FF3x1y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x1y9E[];
static VTBL_ENTRY alt_thunk_names746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x1y9E = {  "_ZN3ccc7FF3x1y9E", // class name
  bases__ZN3ccc7FF3x1y9E, 2,
  &(vtc__ZN3ccc7FF3x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x1y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x1y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x1y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x1y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names746,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y10  : virtual ::ccc::EE3x1 {
  virtual void  pqr(); // _ZN3ccc8FF3x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x1y103abcEv
  ~FF3x1y10(); // tgen
  FF3x1y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x1y103pqrEv");}
void  ccc::FF3x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x1y103abcEv");}
ccc::FF3x1y10 ::~FF3x1y10(){ note_dtor("_ZN3ccc8FF3x1y10E", this);} // tgen
ccc::FF3x1y10 ::FF3x1y10(){ note_ctor("_ZN3ccc8FF3x1y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y10E, buf);
    ::ccc::FF3x1y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y10E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y10E);
    dp->::ccc::FF3x1y10::~FF3x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y10E(Test__ZN3ccc8FF3x1y10E, "_ZN3ccc8FF3x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y10C1Ev();
extern void _ZN3ccc8FF3x1y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y10E[] = {
  NSPAIR(_ZN3ccc8FF3x1y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x1y103pqrEv();
extern void _ZN3ccc8FF3x1y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y10E[] = {
  {&(_ZTVN3ccc8FF3x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y10E[];
static VTBL_ENTRY alt_thunk_names747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y10E = {  "_ZN3ccc8FF3x1y10E", // class name
  bases__ZN3ccc8FF3x1y10E, 2,
  &(vtc__ZN3ccc8FF3x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names747,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y11  : virtual ::ccc::EE3x1 {
  virtual void  pqr(); // _ZN3ccc8FF3x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x1y113efgEv
  ~FF3x1y11(); // tgen
  FF3x1y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x1y113pqrEv");}
void  ccc::FF3x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x1y113efgEv");}
ccc::FF3x1y11 ::~FF3x1y11(){ note_dtor("_ZN3ccc8FF3x1y11E", this);} // tgen
ccc::FF3x1y11 ::FF3x1y11(){ note_ctor("_ZN3ccc8FF3x1y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y11E, buf);
    ::ccc::FF3x1y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y11E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y11E);
    dp->::ccc::FF3x1y11::~FF3x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y11E(Test__ZN3ccc8FF3x1y11E, "_ZN3ccc8FF3x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y11C1Ev();
extern void _ZN3ccc8FF3x1y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y11E[] = {
  NSPAIR(_ZN3ccc8FF3x1y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y11E[];
extern void _ZN3ccc8FF3x1y113efgEv();
extern void _ZN3ccc8FF3x1y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y11E[] = {
  {&(_ZTVN3ccc8FF3x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y11E[];
static VTBL_ENTRY alt_thunk_names748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y11E = {  "_ZN3ccc8FF3x1y11E", // class name
  bases__ZN3ccc8FF3x1y11E, 2,
  &(vtc__ZN3ccc8FF3x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names748,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y12  : virtual ::ccc::EE3x1 {
  virtual void  abc(); // _ZN3ccc8FF3x1y123abcEv
  ~FF3x1y12(); // tgen
  FF3x1y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x1y123abcEv");}
ccc::FF3x1y12 ::~FF3x1y12(){ note_dtor("_ZN3ccc8FF3x1y12E", this);} // tgen
ccc::FF3x1y12 ::FF3x1y12(){ note_ctor("_ZN3ccc8FF3x1y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y12E, buf);
    ::ccc::FF3x1y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y12E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y12E);
    dp->::ccc::FF3x1y12::~FF3x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y12E(Test__ZN3ccc8FF3x1y12E, "_ZN3ccc8FF3x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y12C1Ev();
extern void _ZN3ccc8FF3x1y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y12E[] = {
  NSPAIR(_ZN3ccc8FF3x1y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x1y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y12E[] = {
  {&(_ZTVN3ccc8FF3x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y12E[];
static VTBL_ENTRY alt_thunk_names749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y12E = {  "_ZN3ccc8FF3x1y12E", // class name
  bases__ZN3ccc8FF3x1y12E, 2,
  &(vtc__ZN3ccc8FF3x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names749,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y13  : virtual ::ccc::EE3x1 {
  virtual void  efg(); // _ZN3ccc8FF3x1y133efgEv
  ~FF3x1y13(); // tgen
  FF3x1y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x1y133efgEv");}
ccc::FF3x1y13 ::~FF3x1y13(){ note_dtor("_ZN3ccc8FF3x1y13E", this);} // tgen
ccc::FF3x1y13 ::FF3x1y13(){ note_ctor("_ZN3ccc8FF3x1y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y13E, buf);
    ::ccc::FF3x1y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y13E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y13E);
    dp->::ccc::FF3x1y13::~FF3x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y13E(Test__ZN3ccc8FF3x1y13E, "_ZN3ccc8FF3x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y13C1Ev();
extern void _ZN3ccc8FF3x1y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y13E[] = {
  NSPAIR(_ZN3ccc8FF3x1y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y13E[];
extern void _ZN3ccc8FF3x1y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y13E[] = {
  {&(_ZTVN3ccc8FF3x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y13E[];
static VTBL_ENTRY alt_thunk_names750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y13E = {  "_ZN3ccc8FF3x1y13E", // class name
  bases__ZN3ccc8FF3x1y13E, 2,
  &(vtc__ZN3ccc8FF3x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names750,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y14  : virtual ::ccc::EE3x1 {
  virtual void  pqr(); // _ZN3ccc8FF3x1y143pqrEv
  ~FF3x1y14(); // tgen
  FF3x1y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x1y143pqrEv");}
ccc::FF3x1y14 ::~FF3x1y14(){ note_dtor("_ZN3ccc8FF3x1y14E", this);} // tgen
ccc::FF3x1y14 ::FF3x1y14(){ note_ctor("_ZN3ccc8FF3x1y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y14E, buf);
    ::ccc::FF3x1y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y14E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y14E);
    dp->::ccc::FF3x1y14::~FF3x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y14E(Test__ZN3ccc8FF3x1y14E, "_ZN3ccc8FF3x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y14C1Ev();
extern void _ZN3ccc8FF3x1y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y14E[] = {
  NSPAIR(_ZN3ccc8FF3x1y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x1y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x1y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y14E[] = {
  {&(_ZTVN3ccc8FF3x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y14E[];
static VTBL_ENTRY alt_thunk_names751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y14E = {  "_ZN3ccc8FF3x1y14E", // class name
  bases__ZN3ccc8FF3x1y14E, 2,
  &(vtc__ZN3ccc8FF3x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names751,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x1y15  : virtual ::ccc::EE3x1 {
  ~FF3x1y15(); // tgen
  FF3x1y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x1y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x1y15 ::~FF3x1y15(){ note_dtor("_ZN3ccc8FF3x1y15E", this);} // tgen
ccc::FF3x1y15 ::FF3x1y15(){ note_ctor("_ZN3ccc8FF3x1y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x1y15E, buf);
    ::ccc::FF3x1y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x1y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y15E");
    check_base_class_offset(lv, (::ccc::EE3x1*), 0, "_ZN3ccc8FF3x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x1y15E);
    dp->::ccc::FF3x1y15::~FF3x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x1y15E(Test__ZN3ccc8FF3x1y15E, "_ZN3ccc8FF3x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x1y15C1Ev();
extern void _ZN3ccc8FF3x1y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x1y15E[] = {
  NSPAIR(_ZN3ccc8FF3x1y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x1E[];
static Base_Class bases__ZN3ccc8FF3x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x1y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv)();
extern void _ZN3ccc5EE3x13efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv)();
extern void _ZN3ccc5EE3x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv)();
extern void _ZN3ccc5EE3x13abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x1y15E[] = {
  {&(_ZTVN3ccc8FF3x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x1y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x1E__NS_8FF3x1y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x1y15E[];
static VTBL_ENTRY alt_thunk_names752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x13abcEv,_ZTv0_n20_N3ccc5EE3x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x13pqrEv,_ZTv0_n16_N3ccc5EE3x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x13efgEv,_ZTv0_n12_N3ccc5EE3x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x1y15E = {  "_ZN3ccc8FF3x1y15E", // class name
  bases__ZN3ccc8FF3x1y15E, 2,
  &(vtc__ZN3ccc8FF3x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x1y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x1y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x1y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x1y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names752,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y0  : virtual ::ccc::EE3x2 {
  virtual void  abc(); // _ZN3ccc7FF3x2y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y03pqrEv
  ~FF3x2y0(); // tgen
  FF3x2y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y03abcEv");}
void  ccc::FF3x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y03efgEv");}
void  ccc::FF3x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y03pqrEv");}
ccc::FF3x2y0 ::~FF3x2y0(){ note_dtor("_ZN3ccc7FF3x2y0E", this);} // tgen
ccc::FF3x2y0 ::FF3x2y0(){ note_ctor("_ZN3ccc7FF3x2y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y0E, buf);
    ::ccc::FF3x2y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y0E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y0E);
    dp->::ccc::FF3x2y0::~FF3x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y0E(Test__ZN3ccc7FF3x2y0E, "_ZN3ccc7FF3x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y0C1Ev();
extern void _ZN3ccc7FF3x2y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y0E[] = {
  NSPAIR(_ZN3ccc7FF3x2y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y0E[];
extern void _ZN3ccc7FF3x2y03efgEv();
extern void _ZN3ccc7FF3x2y03pqrEv();
extern void _ZN3ccc7FF3x2y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y0E[] = {
  {&(_ZTVN3ccc7FF3x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y0E[];
static VTBL_ENTRY alt_thunk_names753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y0E = {  "_ZN3ccc7FF3x2y0E", // class name
  bases__ZN3ccc7FF3x2y0E, 2,
  &(vtc__ZN3ccc7FF3x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names753,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y1  : virtual ::ccc::EE3x2 {
  virtual void  abc(); // _ZN3ccc7FF3x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x2y13efgEv
  ~FF3x2y1(); // tgen
  FF3x2y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y13abcEv");}
void  ccc::FF3x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y13pqrEv");}
void  ccc::FF3x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y13efgEv");}
ccc::FF3x2y1 ::~FF3x2y1(){ note_dtor("_ZN3ccc7FF3x2y1E", this);} // tgen
ccc::FF3x2y1 ::FF3x2y1(){ note_ctor("_ZN3ccc7FF3x2y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y1E, buf);
    ::ccc::FF3x2y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y1E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y1E);
    dp->::ccc::FF3x2y1::~FF3x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y1E(Test__ZN3ccc7FF3x2y1E, "_ZN3ccc7FF3x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y1C1Ev();
extern void _ZN3ccc7FF3x2y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y1E[] = {
  NSPAIR(_ZN3ccc7FF3x2y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y1E[];
extern void _ZN3ccc7FF3x2y13efgEv();
extern void _ZN3ccc7FF3x2y13pqrEv();
extern void _ZN3ccc7FF3x2y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y1E[] = {
  {&(_ZTVN3ccc7FF3x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y1E[];
static VTBL_ENTRY alt_thunk_names754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y1E = {  "_ZN3ccc7FF3x2y1E", // class name
  bases__ZN3ccc7FF3x2y1E, 2,
  &(vtc__ZN3ccc7FF3x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names754,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y2  : virtual ::ccc::EE3x2 {
  virtual void  efg(); // _ZN3ccc7FF3x2y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y23pqrEv
  ~FF3x2y2(); // tgen
  FF3x2y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y23efgEv");}
void  ccc::FF3x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y23abcEv");}
void  ccc::FF3x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y23pqrEv");}
ccc::FF3x2y2 ::~FF3x2y2(){ note_dtor("_ZN3ccc7FF3x2y2E", this);} // tgen
ccc::FF3x2y2 ::FF3x2y2(){ note_ctor("_ZN3ccc7FF3x2y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y2E, buf);
    ::ccc::FF3x2y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y2E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y2E);
    dp->::ccc::FF3x2y2::~FF3x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y2E(Test__ZN3ccc7FF3x2y2E, "_ZN3ccc7FF3x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y2C1Ev();
extern void _ZN3ccc7FF3x2y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y2E[] = {
  NSPAIR(_ZN3ccc7FF3x2y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y2E[];
extern void _ZN3ccc7FF3x2y23efgEv();
extern void _ZN3ccc7FF3x2y23pqrEv();
extern void _ZN3ccc7FF3x2y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y2E[] = {
  {&(_ZTVN3ccc7FF3x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y2E[];
static VTBL_ENTRY alt_thunk_names755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y2E = {  "_ZN3ccc7FF3x2y2E", // class name
  bases__ZN3ccc7FF3x2y2E, 2,
  &(vtc__ZN3ccc7FF3x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names755,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y3  : virtual ::ccc::EE3x2 {
  virtual void  efg(); // _ZN3ccc7FF3x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x2y33abcEv
  ~FF3x2y3(); // tgen
  FF3x2y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y33efgEv");}
void  ccc::FF3x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y33pqrEv");}
void  ccc::FF3x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y33abcEv");}
ccc::FF3x2y3 ::~FF3x2y3(){ note_dtor("_ZN3ccc7FF3x2y3E", this);} // tgen
ccc::FF3x2y3 ::FF3x2y3(){ note_ctor("_ZN3ccc7FF3x2y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y3E, buf);
    ::ccc::FF3x2y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y3E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y3E);
    dp->::ccc::FF3x2y3::~FF3x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y3E(Test__ZN3ccc7FF3x2y3E, "_ZN3ccc7FF3x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y3C1Ev();
extern void _ZN3ccc7FF3x2y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y3E[] = {
  NSPAIR(_ZN3ccc7FF3x2y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y3E[];
extern void _ZN3ccc7FF3x2y33efgEv();
extern void _ZN3ccc7FF3x2y33pqrEv();
extern void _ZN3ccc7FF3x2y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y3E[] = {
  {&(_ZTVN3ccc7FF3x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y3E[];
static VTBL_ENTRY alt_thunk_names756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y3E = {  "_ZN3ccc7FF3x2y3E", // class name
  bases__ZN3ccc7FF3x2y3E, 2,
  &(vtc__ZN3ccc7FF3x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names756,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y4  : virtual ::ccc::EE3x2 {
  virtual void  pqr(); // _ZN3ccc7FF3x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x2y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x2y43efgEv
  ~FF3x2y4(); // tgen
  FF3x2y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y43pqrEv");}
void  ccc::FF3x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y43abcEv");}
void  ccc::FF3x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y43efgEv");}
ccc::FF3x2y4 ::~FF3x2y4(){ note_dtor("_ZN3ccc7FF3x2y4E", this);} // tgen
ccc::FF3x2y4 ::FF3x2y4(){ note_ctor("_ZN3ccc7FF3x2y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y4E, buf);
    ::ccc::FF3x2y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y4E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y4E);
    dp->::ccc::FF3x2y4::~FF3x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y4E(Test__ZN3ccc7FF3x2y4E, "_ZN3ccc7FF3x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y4C1Ev();
extern void _ZN3ccc7FF3x2y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y4E[] = {
  NSPAIR(_ZN3ccc7FF3x2y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y4E[];
extern void _ZN3ccc7FF3x2y43efgEv();
extern void _ZN3ccc7FF3x2y43pqrEv();
extern void _ZN3ccc7FF3x2y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y4E[] = {
  {&(_ZTVN3ccc7FF3x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y4E[];
static VTBL_ENTRY alt_thunk_names757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y4E = {  "_ZN3ccc7FF3x2y4E", // class name
  bases__ZN3ccc7FF3x2y4E, 2,
  &(vtc__ZN3ccc7FF3x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names757,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y5  : virtual ::ccc::EE3x2 {
  virtual void  pqr(); // _ZN3ccc7FF3x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x2y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x2y53abcEv
  ~FF3x2y5(); // tgen
  FF3x2y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y53pqrEv");}
void  ccc::FF3x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y53efgEv");}
void  ccc::FF3x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y53abcEv");}
ccc::FF3x2y5 ::~FF3x2y5(){ note_dtor("_ZN3ccc7FF3x2y5E", this);} // tgen
ccc::FF3x2y5 ::FF3x2y5(){ note_ctor("_ZN3ccc7FF3x2y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y5E, buf);
    ::ccc::FF3x2y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y5E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y5E);
    dp->::ccc::FF3x2y5::~FF3x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y5E(Test__ZN3ccc7FF3x2y5E, "_ZN3ccc7FF3x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y5C1Ev();
extern void _ZN3ccc7FF3x2y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y5E[] = {
  NSPAIR(_ZN3ccc7FF3x2y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y5E[];
extern void _ZN3ccc7FF3x2y53efgEv();
extern void _ZN3ccc7FF3x2y53pqrEv();
extern void _ZN3ccc7FF3x2y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y5E[] = {
  {&(_ZTVN3ccc7FF3x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y5E[];
static VTBL_ENTRY alt_thunk_names758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y5E = {  "_ZN3ccc7FF3x2y5E", // class name
  bases__ZN3ccc7FF3x2y5E, 2,
  &(vtc__ZN3ccc7FF3x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names758,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y6  : virtual ::ccc::EE3x2 {
  virtual void  abc(); // _ZN3ccc7FF3x2y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x2y63efgEv
  ~FF3x2y6(); // tgen
  FF3x2y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y63abcEv");}
void  ccc::FF3x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y63efgEv");}
ccc::FF3x2y6 ::~FF3x2y6(){ note_dtor("_ZN3ccc7FF3x2y6E", this);} // tgen
ccc::FF3x2y6 ::FF3x2y6(){ note_ctor("_ZN3ccc7FF3x2y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y6E, buf);
    ::ccc::FF3x2y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y6E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y6E);
    dp->::ccc::FF3x2y6::~FF3x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y6E(Test__ZN3ccc7FF3x2y6E, "_ZN3ccc7FF3x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y6C1Ev();
extern void _ZN3ccc7FF3x2y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y6E[] = {
  NSPAIR(_ZN3ccc7FF3x2y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y6E[];
extern void _ZN3ccc7FF3x2y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x2y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y6E[] = {
  {&(_ZTVN3ccc7FF3x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y6E[];
static VTBL_ENTRY alt_thunk_names759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y6E = {  "_ZN3ccc7FF3x2y6E", // class name
  bases__ZN3ccc7FF3x2y6E, 2,
  &(vtc__ZN3ccc7FF3x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names759,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y7  : virtual ::ccc::EE3x2 {
  virtual void  abc(); // _ZN3ccc7FF3x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y73pqrEv
  ~FF3x2y7(); // tgen
  FF3x2y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y73abcEv");}
void  ccc::FF3x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y73pqrEv");}
ccc::FF3x2y7 ::~FF3x2y7(){ note_dtor("_ZN3ccc7FF3x2y7E", this);} // tgen
ccc::FF3x2y7 ::FF3x2y7(){ note_ctor("_ZN3ccc7FF3x2y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y7E, buf);
    ::ccc::FF3x2y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y7E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y7E);
    dp->::ccc::FF3x2y7::~FF3x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y7E(Test__ZN3ccc7FF3x2y7E, "_ZN3ccc7FF3x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y7C1Ev();
extern void _ZN3ccc7FF3x2y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y7E[] = {
  NSPAIR(_ZN3ccc7FF3x2y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x2y73pqrEv();
extern void _ZN3ccc7FF3x2y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y7E[] = {
  {&(_ZTVN3ccc7FF3x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y7E[];
static VTBL_ENTRY alt_thunk_names760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y7E = {  "_ZN3ccc7FF3x2y7E", // class name
  bases__ZN3ccc7FF3x2y7E, 2,
  &(vtc__ZN3ccc7FF3x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names760,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y8  : virtual ::ccc::EE3x2 {
  virtual void  efg(); // _ZN3ccc7FF3x2y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x2y83abcEv
  ~FF3x2y8(); // tgen
  FF3x2y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y83efgEv");}
void  ccc::FF3x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x2y83abcEv");}
ccc::FF3x2y8 ::~FF3x2y8(){ note_dtor("_ZN3ccc7FF3x2y8E", this);} // tgen
ccc::FF3x2y8 ::FF3x2y8(){ note_ctor("_ZN3ccc7FF3x2y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y8E, buf);
    ::ccc::FF3x2y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y8E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y8E);
    dp->::ccc::FF3x2y8::~FF3x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y8E(Test__ZN3ccc7FF3x2y8E, "_ZN3ccc7FF3x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y8C1Ev();
extern void _ZN3ccc7FF3x2y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y8E[] = {
  NSPAIR(_ZN3ccc7FF3x2y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y8E[];
extern void _ZN3ccc7FF3x2y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x2y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y8E[] = {
  {&(_ZTVN3ccc7FF3x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y8E[];
static VTBL_ENTRY alt_thunk_names761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y8E = {  "_ZN3ccc7FF3x2y8E", // class name
  bases__ZN3ccc7FF3x2y8E, 2,
  &(vtc__ZN3ccc7FF3x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names761,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y9  : virtual ::ccc::EE3x2 {
  virtual void  efg(); // _ZN3ccc7FF3x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x2y93pqrEv
  ~FF3x2y9(); // tgen
  FF3x2y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x2y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x2y93efgEv");}
void  ccc::FF3x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x2y93pqrEv");}
ccc::FF3x2y9 ::~FF3x2y9(){ note_dtor("_ZN3ccc7FF3x2y9E", this);} // tgen
ccc::FF3x2y9 ::FF3x2y9(){ note_ctor("_ZN3ccc7FF3x2y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x2y9E, buf);
    ::ccc::FF3x2y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x2y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y9E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc7FF3x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x2y9E);
    dp->::ccc::FF3x2y9::~FF3x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x2y9E(Test__ZN3ccc7FF3x2y9E, "_ZN3ccc7FF3x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x2y9C1Ev();
extern void _ZN3ccc7FF3x2y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x2y9E[] = {
  NSPAIR(_ZN3ccc7FF3x2y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc7FF3x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y9E[];
extern void _ZN3ccc7FF3x2y93efgEv();
extern void _ZN3ccc7FF3x2y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x2y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x2y9E[] = {
  {&(_ZTVN3ccc7FF3x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x2y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_7FF3x2y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x2y9E[];
static VTBL_ENTRY alt_thunk_names762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x2y9E = {  "_ZN3ccc7FF3x2y9E", // class name
  bases__ZN3ccc7FF3x2y9E, 2,
  &(vtc__ZN3ccc7FF3x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x2y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x2y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x2y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x2y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names762,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y10  : virtual ::ccc::EE3x2 {
  virtual void  pqr(); // _ZN3ccc8FF3x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x2y103abcEv
  ~FF3x2y10(); // tgen
  FF3x2y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x2y103pqrEv");}
void  ccc::FF3x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x2y103abcEv");}
ccc::FF3x2y10 ::~FF3x2y10(){ note_dtor("_ZN3ccc8FF3x2y10E", this);} // tgen
ccc::FF3x2y10 ::FF3x2y10(){ note_ctor("_ZN3ccc8FF3x2y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y10E, buf);
    ::ccc::FF3x2y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y10E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y10E);
    dp->::ccc::FF3x2y10::~FF3x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y10E(Test__ZN3ccc8FF3x2y10E, "_ZN3ccc8FF3x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y10C1Ev();
extern void _ZN3ccc8FF3x2y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y10E[] = {
  NSPAIR(_ZN3ccc8FF3x2y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x2y103pqrEv();
extern void _ZN3ccc8FF3x2y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y10E[] = {
  {&(_ZTVN3ccc8FF3x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y10E[];
static VTBL_ENTRY alt_thunk_names763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y10E = {  "_ZN3ccc8FF3x2y10E", // class name
  bases__ZN3ccc8FF3x2y10E, 2,
  &(vtc__ZN3ccc8FF3x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names763,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y11  : virtual ::ccc::EE3x2 {
  virtual void  pqr(); // _ZN3ccc8FF3x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x2y113efgEv
  ~FF3x2y11(); // tgen
  FF3x2y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x2y113pqrEv");}
void  ccc::FF3x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x2y113efgEv");}
ccc::FF3x2y11 ::~FF3x2y11(){ note_dtor("_ZN3ccc8FF3x2y11E", this);} // tgen
ccc::FF3x2y11 ::FF3x2y11(){ note_ctor("_ZN3ccc8FF3x2y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y11E, buf);
    ::ccc::FF3x2y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y11E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y11E);
    dp->::ccc::FF3x2y11::~FF3x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y11E(Test__ZN3ccc8FF3x2y11E, "_ZN3ccc8FF3x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y11C1Ev();
extern void _ZN3ccc8FF3x2y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y11E[] = {
  NSPAIR(_ZN3ccc8FF3x2y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y11E[];
extern void _ZN3ccc8FF3x2y113efgEv();
extern void _ZN3ccc8FF3x2y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y11E[] = {
  {&(_ZTVN3ccc8FF3x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y11E[];
static VTBL_ENTRY alt_thunk_names764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y11E = {  "_ZN3ccc8FF3x2y11E", // class name
  bases__ZN3ccc8FF3x2y11E, 2,
  &(vtc__ZN3ccc8FF3x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names764,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y12  : virtual ::ccc::EE3x2 {
  virtual void  abc(); // _ZN3ccc8FF3x2y123abcEv
  ~FF3x2y12(); // tgen
  FF3x2y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x2y123abcEv");}
ccc::FF3x2y12 ::~FF3x2y12(){ note_dtor("_ZN3ccc8FF3x2y12E", this);} // tgen
ccc::FF3x2y12 ::FF3x2y12(){ note_ctor("_ZN3ccc8FF3x2y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y12E, buf);
    ::ccc::FF3x2y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y12E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y12E);
    dp->::ccc::FF3x2y12::~FF3x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y12E(Test__ZN3ccc8FF3x2y12E, "_ZN3ccc8FF3x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y12C1Ev();
extern void _ZN3ccc8FF3x2y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y12E[] = {
  NSPAIR(_ZN3ccc8FF3x2y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x2y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y12E[] = {
  {&(_ZTVN3ccc8FF3x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y12E[];
static VTBL_ENTRY alt_thunk_names765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y12E = {  "_ZN3ccc8FF3x2y12E", // class name
  bases__ZN3ccc8FF3x2y12E, 2,
  &(vtc__ZN3ccc8FF3x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names765,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y13  : virtual ::ccc::EE3x2 {
  virtual void  efg(); // _ZN3ccc8FF3x2y133efgEv
  ~FF3x2y13(); // tgen
  FF3x2y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x2y133efgEv");}
ccc::FF3x2y13 ::~FF3x2y13(){ note_dtor("_ZN3ccc8FF3x2y13E", this);} // tgen
ccc::FF3x2y13 ::FF3x2y13(){ note_ctor("_ZN3ccc8FF3x2y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y13E, buf);
    ::ccc::FF3x2y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y13E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y13E);
    dp->::ccc::FF3x2y13::~FF3x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y13E(Test__ZN3ccc8FF3x2y13E, "_ZN3ccc8FF3x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y13C1Ev();
extern void _ZN3ccc8FF3x2y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y13E[] = {
  NSPAIR(_ZN3ccc8FF3x2y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y13E[];
extern void _ZN3ccc8FF3x2y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y13E[] = {
  {&(_ZTVN3ccc8FF3x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y13E[];
static VTBL_ENTRY alt_thunk_names766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y13E = {  "_ZN3ccc8FF3x2y13E", // class name
  bases__ZN3ccc8FF3x2y13E, 2,
  &(vtc__ZN3ccc8FF3x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names766,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y14  : virtual ::ccc::EE3x2 {
  virtual void  pqr(); // _ZN3ccc8FF3x2y143pqrEv
  ~FF3x2y14(); // tgen
  FF3x2y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x2y143pqrEv");}
ccc::FF3x2y14 ::~FF3x2y14(){ note_dtor("_ZN3ccc8FF3x2y14E", this);} // tgen
ccc::FF3x2y14 ::FF3x2y14(){ note_ctor("_ZN3ccc8FF3x2y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y14E, buf);
    ::ccc::FF3x2y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y14E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y14E);
    dp->::ccc::FF3x2y14::~FF3x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y14E(Test__ZN3ccc8FF3x2y14E, "_ZN3ccc8FF3x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y14C1Ev();
extern void _ZN3ccc8FF3x2y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y14E[] = {
  NSPAIR(_ZN3ccc8FF3x2y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x2y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x2y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y14E[] = {
  {&(_ZTVN3ccc8FF3x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y14E[];
static VTBL_ENTRY alt_thunk_names767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y14E = {  "_ZN3ccc8FF3x2y14E", // class name
  bases__ZN3ccc8FF3x2y14E, 2,
  &(vtc__ZN3ccc8FF3x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names767,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x2y15  : virtual ::ccc::EE3x2 {
  ~FF3x2y15(); // tgen
  FF3x2y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x2y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x2y15 ::~FF3x2y15(){ note_dtor("_ZN3ccc8FF3x2y15E", this);} // tgen
ccc::FF3x2y15 ::FF3x2y15(){ note_ctor("_ZN3ccc8FF3x2y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x2y15E, buf);
    ::ccc::FF3x2y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x2y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y15E");
    check_base_class_offset(lv, (::ccc::EE3x2*), 0, "_ZN3ccc8FF3x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x2y15E);
    dp->::ccc::FF3x2y15::~FF3x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x2y15E(Test__ZN3ccc8FF3x2y15E, "_ZN3ccc8FF3x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x2y15C1Ev();
extern void _ZN3ccc8FF3x2y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x2y15E[] = {
  NSPAIR(_ZN3ccc8FF3x2y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x2E[];
static Base_Class bases__ZN3ccc8FF3x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x2y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv)();
extern void _ZN3ccc5EE3x23efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv)();
extern void _ZN3ccc5EE3x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv)();
extern void _ZN3ccc5EE3x23abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x2y15E[] = {
  {&(_ZTVN3ccc8FF3x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x2y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x2E__NS_8FF3x2y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x2y15E[];
static VTBL_ENTRY alt_thunk_names768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x23abcEv,_ZTv0_n20_N3ccc5EE3x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x23pqrEv,_ZTv0_n16_N3ccc5EE3x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x23efgEv,_ZTv0_n12_N3ccc5EE3x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x2y15E = {  "_ZN3ccc8FF3x2y15E", // class name
  bases__ZN3ccc8FF3x2y15E, 2,
  &(vtc__ZN3ccc8FF3x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x2y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x2y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x2y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x2y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names768,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y0  : virtual ::ccc::EE3x3 {
  virtual void  abc(); // _ZN3ccc7FF3x3y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y03pqrEv
  ~FF3x3y0(); // tgen
  FF3x3y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y03abcEv");}
void  ccc::FF3x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y03efgEv");}
void  ccc::FF3x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y03pqrEv");}
ccc::FF3x3y0 ::~FF3x3y0(){ note_dtor("_ZN3ccc7FF3x3y0E", this);} // tgen
ccc::FF3x3y0 ::FF3x3y0(){ note_ctor("_ZN3ccc7FF3x3y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y0E, buf);
    ::ccc::FF3x3y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y0E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y0E);
    dp->::ccc::FF3x3y0::~FF3x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y0E(Test__ZN3ccc7FF3x3y0E, "_ZN3ccc7FF3x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y0C1Ev();
extern void _ZN3ccc7FF3x3y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y0E[] = {
  NSPAIR(_ZN3ccc7FF3x3y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y0E[];
extern void _ZN3ccc7FF3x3y03efgEv();
extern void _ZN3ccc7FF3x3y03pqrEv();
extern void _ZN3ccc7FF3x3y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y0E[] = {
  {&(_ZTVN3ccc7FF3x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y0E[];
static VTBL_ENTRY alt_thunk_names769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y0E = {  "_ZN3ccc7FF3x3y0E", // class name
  bases__ZN3ccc7FF3x3y0E, 2,
  &(vtc__ZN3ccc7FF3x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names769,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y1  : virtual ::ccc::EE3x3 {
  virtual void  abc(); // _ZN3ccc7FF3x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x3y13efgEv
  ~FF3x3y1(); // tgen
  FF3x3y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y13abcEv");}
void  ccc::FF3x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y13pqrEv");}
void  ccc::FF3x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y13efgEv");}
ccc::FF3x3y1 ::~FF3x3y1(){ note_dtor("_ZN3ccc7FF3x3y1E", this);} // tgen
ccc::FF3x3y1 ::FF3x3y1(){ note_ctor("_ZN3ccc7FF3x3y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y1E, buf);
    ::ccc::FF3x3y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y1E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y1E);
    dp->::ccc::FF3x3y1::~FF3x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y1E(Test__ZN3ccc7FF3x3y1E, "_ZN3ccc7FF3x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y1C1Ev();
extern void _ZN3ccc7FF3x3y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y1E[] = {
  NSPAIR(_ZN3ccc7FF3x3y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y1E[];
extern void _ZN3ccc7FF3x3y13efgEv();
extern void _ZN3ccc7FF3x3y13pqrEv();
extern void _ZN3ccc7FF3x3y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y1E[] = {
  {&(_ZTVN3ccc7FF3x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y1E[];
static VTBL_ENTRY alt_thunk_names770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y1E = {  "_ZN3ccc7FF3x3y1E", // class name
  bases__ZN3ccc7FF3x3y1E, 2,
  &(vtc__ZN3ccc7FF3x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names770,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y2  : virtual ::ccc::EE3x3 {
  virtual void  efg(); // _ZN3ccc7FF3x3y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y23pqrEv
  ~FF3x3y2(); // tgen
  FF3x3y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y23efgEv");}
void  ccc::FF3x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y23abcEv");}
void  ccc::FF3x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y23pqrEv");}
ccc::FF3x3y2 ::~FF3x3y2(){ note_dtor("_ZN3ccc7FF3x3y2E", this);} // tgen
ccc::FF3x3y2 ::FF3x3y2(){ note_ctor("_ZN3ccc7FF3x3y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y2E, buf);
    ::ccc::FF3x3y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y2E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y2E);
    dp->::ccc::FF3x3y2::~FF3x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y2E(Test__ZN3ccc7FF3x3y2E, "_ZN3ccc7FF3x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y2C1Ev();
extern void _ZN3ccc7FF3x3y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y2E[] = {
  NSPAIR(_ZN3ccc7FF3x3y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y2E[];
extern void _ZN3ccc7FF3x3y23efgEv();
extern void _ZN3ccc7FF3x3y23pqrEv();
extern void _ZN3ccc7FF3x3y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y2E[] = {
  {&(_ZTVN3ccc7FF3x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y2E[];
static VTBL_ENTRY alt_thunk_names771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y2E = {  "_ZN3ccc7FF3x3y2E", // class name
  bases__ZN3ccc7FF3x3y2E, 2,
  &(vtc__ZN3ccc7FF3x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names771,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y3  : virtual ::ccc::EE3x3 {
  virtual void  efg(); // _ZN3ccc7FF3x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x3y33abcEv
  ~FF3x3y3(); // tgen
  FF3x3y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y33efgEv");}
void  ccc::FF3x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y33pqrEv");}
void  ccc::FF3x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y33abcEv");}
ccc::FF3x3y3 ::~FF3x3y3(){ note_dtor("_ZN3ccc7FF3x3y3E", this);} // tgen
ccc::FF3x3y3 ::FF3x3y3(){ note_ctor("_ZN3ccc7FF3x3y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y3E, buf);
    ::ccc::FF3x3y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y3E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y3E);
    dp->::ccc::FF3x3y3::~FF3x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y3E(Test__ZN3ccc7FF3x3y3E, "_ZN3ccc7FF3x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y3C1Ev();
extern void _ZN3ccc7FF3x3y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y3E[] = {
  NSPAIR(_ZN3ccc7FF3x3y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y3E[];
extern void _ZN3ccc7FF3x3y33efgEv();
extern void _ZN3ccc7FF3x3y33pqrEv();
extern void _ZN3ccc7FF3x3y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y3E[] = {
  {&(_ZTVN3ccc7FF3x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y3E[];
static VTBL_ENTRY alt_thunk_names772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y3E = {  "_ZN3ccc7FF3x3y3E", // class name
  bases__ZN3ccc7FF3x3y3E, 2,
  &(vtc__ZN3ccc7FF3x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names772,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y4  : virtual ::ccc::EE3x3 {
  virtual void  pqr(); // _ZN3ccc7FF3x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x3y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x3y43efgEv
  ~FF3x3y4(); // tgen
  FF3x3y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y43pqrEv");}
void  ccc::FF3x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y43abcEv");}
void  ccc::FF3x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y43efgEv");}
ccc::FF3x3y4 ::~FF3x3y4(){ note_dtor("_ZN3ccc7FF3x3y4E", this);} // tgen
ccc::FF3x3y4 ::FF3x3y4(){ note_ctor("_ZN3ccc7FF3x3y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y4E, buf);
    ::ccc::FF3x3y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y4E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y4E);
    dp->::ccc::FF3x3y4::~FF3x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y4E(Test__ZN3ccc7FF3x3y4E, "_ZN3ccc7FF3x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y4C1Ev();
extern void _ZN3ccc7FF3x3y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y4E[] = {
  NSPAIR(_ZN3ccc7FF3x3y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y4E[];
extern void _ZN3ccc7FF3x3y43efgEv();
extern void _ZN3ccc7FF3x3y43pqrEv();
extern void _ZN3ccc7FF3x3y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y4E[] = {
  {&(_ZTVN3ccc7FF3x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y4E[];
static VTBL_ENTRY alt_thunk_names773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y4E = {  "_ZN3ccc7FF3x3y4E", // class name
  bases__ZN3ccc7FF3x3y4E, 2,
  &(vtc__ZN3ccc7FF3x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names773,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y5  : virtual ::ccc::EE3x3 {
  virtual void  pqr(); // _ZN3ccc7FF3x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x3y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x3y53abcEv
  ~FF3x3y5(); // tgen
  FF3x3y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y53pqrEv");}
void  ccc::FF3x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y53efgEv");}
void  ccc::FF3x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y53abcEv");}
ccc::FF3x3y5 ::~FF3x3y5(){ note_dtor("_ZN3ccc7FF3x3y5E", this);} // tgen
ccc::FF3x3y5 ::FF3x3y5(){ note_ctor("_ZN3ccc7FF3x3y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y5E, buf);
    ::ccc::FF3x3y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y5E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y5E);
    dp->::ccc::FF3x3y5::~FF3x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y5E(Test__ZN3ccc7FF3x3y5E, "_ZN3ccc7FF3x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y5C1Ev();
extern void _ZN3ccc7FF3x3y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y5E[] = {
  NSPAIR(_ZN3ccc7FF3x3y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y5E[];
extern void _ZN3ccc7FF3x3y53efgEv();
extern void _ZN3ccc7FF3x3y53pqrEv();
extern void _ZN3ccc7FF3x3y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y5E[] = {
  {&(_ZTVN3ccc7FF3x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y5E[];
static VTBL_ENTRY alt_thunk_names774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y5E = {  "_ZN3ccc7FF3x3y5E", // class name
  bases__ZN3ccc7FF3x3y5E, 2,
  &(vtc__ZN3ccc7FF3x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names774,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y6  : virtual ::ccc::EE3x3 {
  virtual void  abc(); // _ZN3ccc7FF3x3y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x3y63efgEv
  ~FF3x3y6(); // tgen
  FF3x3y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y63abcEv");}
void  ccc::FF3x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y63efgEv");}
ccc::FF3x3y6 ::~FF3x3y6(){ note_dtor("_ZN3ccc7FF3x3y6E", this);} // tgen
ccc::FF3x3y6 ::FF3x3y6(){ note_ctor("_ZN3ccc7FF3x3y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y6E, buf);
    ::ccc::FF3x3y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y6E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y6E);
    dp->::ccc::FF3x3y6::~FF3x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y6E(Test__ZN3ccc7FF3x3y6E, "_ZN3ccc7FF3x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y6C1Ev();
extern void _ZN3ccc7FF3x3y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y6E[] = {
  NSPAIR(_ZN3ccc7FF3x3y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y6E[];
extern void _ZN3ccc7FF3x3y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x3y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y6E[] = {
  {&(_ZTVN3ccc7FF3x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y6E[];
static VTBL_ENTRY alt_thunk_names775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y6E = {  "_ZN3ccc7FF3x3y6E", // class name
  bases__ZN3ccc7FF3x3y6E, 2,
  &(vtc__ZN3ccc7FF3x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names775,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y7  : virtual ::ccc::EE3x3 {
  virtual void  abc(); // _ZN3ccc7FF3x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y73pqrEv
  ~FF3x3y7(); // tgen
  FF3x3y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y73abcEv");}
void  ccc::FF3x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y73pqrEv");}
ccc::FF3x3y7 ::~FF3x3y7(){ note_dtor("_ZN3ccc7FF3x3y7E", this);} // tgen
ccc::FF3x3y7 ::FF3x3y7(){ note_ctor("_ZN3ccc7FF3x3y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y7E, buf);
    ::ccc::FF3x3y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y7E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y7E);
    dp->::ccc::FF3x3y7::~FF3x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y7E(Test__ZN3ccc7FF3x3y7E, "_ZN3ccc7FF3x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y7C1Ev();
extern void _ZN3ccc7FF3x3y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y7E[] = {
  NSPAIR(_ZN3ccc7FF3x3y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x3y73pqrEv();
extern void _ZN3ccc7FF3x3y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y7E[] = {
  {&(_ZTVN3ccc7FF3x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y7E[];
static VTBL_ENTRY alt_thunk_names776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y7E = {  "_ZN3ccc7FF3x3y7E", // class name
  bases__ZN3ccc7FF3x3y7E, 2,
  &(vtc__ZN3ccc7FF3x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names776,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y8  : virtual ::ccc::EE3x3 {
  virtual void  efg(); // _ZN3ccc7FF3x3y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x3y83abcEv
  ~FF3x3y8(); // tgen
  FF3x3y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y83efgEv");}
void  ccc::FF3x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x3y83abcEv");}
ccc::FF3x3y8 ::~FF3x3y8(){ note_dtor("_ZN3ccc7FF3x3y8E", this);} // tgen
ccc::FF3x3y8 ::FF3x3y8(){ note_ctor("_ZN3ccc7FF3x3y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y8E, buf);
    ::ccc::FF3x3y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y8E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y8E);
    dp->::ccc::FF3x3y8::~FF3x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y8E(Test__ZN3ccc7FF3x3y8E, "_ZN3ccc7FF3x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y8C1Ev();
extern void _ZN3ccc7FF3x3y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y8E[] = {
  NSPAIR(_ZN3ccc7FF3x3y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y8E[];
extern void _ZN3ccc7FF3x3y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x3y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y8E[] = {
  {&(_ZTVN3ccc7FF3x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y8E[];
static VTBL_ENTRY alt_thunk_names777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y8E = {  "_ZN3ccc7FF3x3y8E", // class name
  bases__ZN3ccc7FF3x3y8E, 2,
  &(vtc__ZN3ccc7FF3x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names777,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y9  : virtual ::ccc::EE3x3 {
  virtual void  efg(); // _ZN3ccc7FF3x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x3y93pqrEv
  ~FF3x3y9(); // tgen
  FF3x3y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x3y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x3y93efgEv");}
void  ccc::FF3x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x3y93pqrEv");}
ccc::FF3x3y9 ::~FF3x3y9(){ note_dtor("_ZN3ccc7FF3x3y9E", this);} // tgen
ccc::FF3x3y9 ::FF3x3y9(){ note_ctor("_ZN3ccc7FF3x3y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x3y9E, buf);
    ::ccc::FF3x3y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x3y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y9E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc7FF3x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x3y9E);
    dp->::ccc::FF3x3y9::~FF3x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x3y9E(Test__ZN3ccc7FF3x3y9E, "_ZN3ccc7FF3x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x3y9C1Ev();
extern void _ZN3ccc7FF3x3y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x3y9E[] = {
  NSPAIR(_ZN3ccc7FF3x3y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc7FF3x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y9E[];
extern void _ZN3ccc7FF3x3y93efgEv();
extern void _ZN3ccc7FF3x3y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x3y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x3y9E[] = {
  {&(_ZTVN3ccc7FF3x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x3y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_7FF3x3y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x3y9E[];
static VTBL_ENTRY alt_thunk_names778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x3y9E = {  "_ZN3ccc7FF3x3y9E", // class name
  bases__ZN3ccc7FF3x3y9E, 2,
  &(vtc__ZN3ccc7FF3x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x3y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x3y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x3y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x3y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names778,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y10  : virtual ::ccc::EE3x3 {
  virtual void  pqr(); // _ZN3ccc8FF3x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x3y103abcEv
  ~FF3x3y10(); // tgen
  FF3x3y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x3y103pqrEv");}
void  ccc::FF3x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x3y103abcEv");}
ccc::FF3x3y10 ::~FF3x3y10(){ note_dtor("_ZN3ccc8FF3x3y10E", this);} // tgen
ccc::FF3x3y10 ::FF3x3y10(){ note_ctor("_ZN3ccc8FF3x3y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y10E, buf);
    ::ccc::FF3x3y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y10E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y10E);
    dp->::ccc::FF3x3y10::~FF3x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y10E(Test__ZN3ccc8FF3x3y10E, "_ZN3ccc8FF3x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y10C1Ev();
extern void _ZN3ccc8FF3x3y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y10E[] = {
  NSPAIR(_ZN3ccc8FF3x3y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x3y103pqrEv();
extern void _ZN3ccc8FF3x3y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y10E[] = {
  {&(_ZTVN3ccc8FF3x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y10E[];
static VTBL_ENTRY alt_thunk_names779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y10E = {  "_ZN3ccc8FF3x3y10E", // class name
  bases__ZN3ccc8FF3x3y10E, 2,
  &(vtc__ZN3ccc8FF3x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names779,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y11  : virtual ::ccc::EE3x3 {
  virtual void  pqr(); // _ZN3ccc8FF3x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x3y113efgEv
  ~FF3x3y11(); // tgen
  FF3x3y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x3y113pqrEv");}
void  ccc::FF3x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x3y113efgEv");}
ccc::FF3x3y11 ::~FF3x3y11(){ note_dtor("_ZN3ccc8FF3x3y11E", this);} // tgen
ccc::FF3x3y11 ::FF3x3y11(){ note_ctor("_ZN3ccc8FF3x3y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y11E, buf);
    ::ccc::FF3x3y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y11E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y11E);
    dp->::ccc::FF3x3y11::~FF3x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y11E(Test__ZN3ccc8FF3x3y11E, "_ZN3ccc8FF3x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y11C1Ev();
extern void _ZN3ccc8FF3x3y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y11E[] = {
  NSPAIR(_ZN3ccc8FF3x3y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y11E[];
extern void _ZN3ccc8FF3x3y113efgEv();
extern void _ZN3ccc8FF3x3y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y11E[] = {
  {&(_ZTVN3ccc8FF3x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y11E[];
static VTBL_ENTRY alt_thunk_names780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y11E = {  "_ZN3ccc8FF3x3y11E", // class name
  bases__ZN3ccc8FF3x3y11E, 2,
  &(vtc__ZN3ccc8FF3x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names780,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y12  : virtual ::ccc::EE3x3 {
  virtual void  abc(); // _ZN3ccc8FF3x3y123abcEv
  ~FF3x3y12(); // tgen
  FF3x3y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x3y123abcEv");}
ccc::FF3x3y12 ::~FF3x3y12(){ note_dtor("_ZN3ccc8FF3x3y12E", this);} // tgen
ccc::FF3x3y12 ::FF3x3y12(){ note_ctor("_ZN3ccc8FF3x3y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y12E, buf);
    ::ccc::FF3x3y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y12E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y12E);
    dp->::ccc::FF3x3y12::~FF3x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y12E(Test__ZN3ccc8FF3x3y12E, "_ZN3ccc8FF3x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y12C1Ev();
extern void _ZN3ccc8FF3x3y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y12E[] = {
  NSPAIR(_ZN3ccc8FF3x3y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x3y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y12E[] = {
  {&(_ZTVN3ccc8FF3x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y12E[];
static VTBL_ENTRY alt_thunk_names781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y12E = {  "_ZN3ccc8FF3x3y12E", // class name
  bases__ZN3ccc8FF3x3y12E, 2,
  &(vtc__ZN3ccc8FF3x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names781,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y13  : virtual ::ccc::EE3x3 {
  virtual void  efg(); // _ZN3ccc8FF3x3y133efgEv
  ~FF3x3y13(); // tgen
  FF3x3y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x3y133efgEv");}
ccc::FF3x3y13 ::~FF3x3y13(){ note_dtor("_ZN3ccc8FF3x3y13E", this);} // tgen
ccc::FF3x3y13 ::FF3x3y13(){ note_ctor("_ZN3ccc8FF3x3y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y13E, buf);
    ::ccc::FF3x3y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y13E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y13E);
    dp->::ccc::FF3x3y13::~FF3x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y13E(Test__ZN3ccc8FF3x3y13E, "_ZN3ccc8FF3x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y13C1Ev();
extern void _ZN3ccc8FF3x3y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y13E[] = {
  NSPAIR(_ZN3ccc8FF3x3y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y13E[];
extern void _ZN3ccc8FF3x3y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y13E[] = {
  {&(_ZTVN3ccc8FF3x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y13E[];
static VTBL_ENTRY alt_thunk_names782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y13E = {  "_ZN3ccc8FF3x3y13E", // class name
  bases__ZN3ccc8FF3x3y13E, 2,
  &(vtc__ZN3ccc8FF3x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names782,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y14  : virtual ::ccc::EE3x3 {
  virtual void  pqr(); // _ZN3ccc8FF3x3y143pqrEv
  ~FF3x3y14(); // tgen
  FF3x3y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x3y143pqrEv");}
ccc::FF3x3y14 ::~FF3x3y14(){ note_dtor("_ZN3ccc8FF3x3y14E", this);} // tgen
ccc::FF3x3y14 ::FF3x3y14(){ note_ctor("_ZN3ccc8FF3x3y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y14E, buf);
    ::ccc::FF3x3y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y14E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y14E);
    dp->::ccc::FF3x3y14::~FF3x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y14E(Test__ZN3ccc8FF3x3y14E, "_ZN3ccc8FF3x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y14C1Ev();
extern void _ZN3ccc8FF3x3y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y14E[] = {
  NSPAIR(_ZN3ccc8FF3x3y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x3y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x3y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y14E[] = {
  {&(_ZTVN3ccc8FF3x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y14E[];
static VTBL_ENTRY alt_thunk_names783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y14E = {  "_ZN3ccc8FF3x3y14E", // class name
  bases__ZN3ccc8FF3x3y14E, 2,
  &(vtc__ZN3ccc8FF3x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names783,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x3y15  : virtual ::ccc::EE3x3 {
  ~FF3x3y15(); // tgen
  FF3x3y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x3y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x3y15 ::~FF3x3y15(){ note_dtor("_ZN3ccc8FF3x3y15E", this);} // tgen
ccc::FF3x3y15 ::FF3x3y15(){ note_ctor("_ZN3ccc8FF3x3y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x3y15E, buf);
    ::ccc::FF3x3y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x3y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y15E");
    check_base_class_offset(lv, (::ccc::EE3x3*), 0, "_ZN3ccc8FF3x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x3y15E);
    dp->::ccc::FF3x3y15::~FF3x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x3y15E(Test__ZN3ccc8FF3x3y15E, "_ZN3ccc8FF3x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x3y15C1Ev();
extern void _ZN3ccc8FF3x3y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x3y15E[] = {
  NSPAIR(_ZN3ccc8FF3x3y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x3E[];
static Base_Class bases__ZN3ccc8FF3x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x3y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv)();
extern void _ZN3ccc5EE3x33efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv)();
extern void _ZN3ccc5EE3x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv)();
extern void _ZN3ccc5EE3x33abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x3y15E[] = {
  {&(_ZTVN3ccc8FF3x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x3y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x3E__NS_8FF3x3y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x3y15E[];
static VTBL_ENTRY alt_thunk_names784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x33abcEv,_ZTv0_n20_N3ccc5EE3x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x33pqrEv,_ZTv0_n16_N3ccc5EE3x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x33efgEv,_ZTv0_n12_N3ccc5EE3x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x3y15E = {  "_ZN3ccc8FF3x3y15E", // class name
  bases__ZN3ccc8FF3x3y15E, 2,
  &(vtc__ZN3ccc8FF3x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x3y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x3y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x3y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x3y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names784,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y0  : virtual ::ccc::EE3x4 {
  virtual void  abc(); // _ZN3ccc7FF3x4y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y03pqrEv
  ~FF3x4y0(); // tgen
  FF3x4y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y03abcEv");}
void  ccc::FF3x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y03efgEv");}
void  ccc::FF3x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y03pqrEv");}
ccc::FF3x4y0 ::~FF3x4y0(){ note_dtor("_ZN3ccc7FF3x4y0E", this);} // tgen
ccc::FF3x4y0 ::FF3x4y0(){ note_ctor("_ZN3ccc7FF3x4y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y0E, buf);
    ::ccc::FF3x4y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y0E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y0E);
    dp->::ccc::FF3x4y0::~FF3x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y0E(Test__ZN3ccc7FF3x4y0E, "_ZN3ccc7FF3x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y0C1Ev();
extern void _ZN3ccc7FF3x4y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y0E[] = {
  NSPAIR(_ZN3ccc7FF3x4y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y0E[];
extern void _ZN3ccc7FF3x4y03efgEv();
extern void _ZN3ccc7FF3x4y03pqrEv();
extern void _ZN3ccc7FF3x4y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y0E[] = {
  {&(_ZTVN3ccc7FF3x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y0E[];
static VTBL_ENTRY alt_thunk_names785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y0E = {  "_ZN3ccc7FF3x4y0E", // class name
  bases__ZN3ccc7FF3x4y0E, 2,
  &(vtc__ZN3ccc7FF3x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names785,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y1  : virtual ::ccc::EE3x4 {
  virtual void  abc(); // _ZN3ccc7FF3x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x4y13efgEv
  ~FF3x4y1(); // tgen
  FF3x4y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y13abcEv");}
void  ccc::FF3x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y13pqrEv");}
void  ccc::FF3x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y13efgEv");}
ccc::FF3x4y1 ::~FF3x4y1(){ note_dtor("_ZN3ccc7FF3x4y1E", this);} // tgen
ccc::FF3x4y1 ::FF3x4y1(){ note_ctor("_ZN3ccc7FF3x4y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y1E, buf);
    ::ccc::FF3x4y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y1E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y1E);
    dp->::ccc::FF3x4y1::~FF3x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y1E(Test__ZN3ccc7FF3x4y1E, "_ZN3ccc7FF3x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y1C1Ev();
extern void _ZN3ccc7FF3x4y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y1E[] = {
  NSPAIR(_ZN3ccc7FF3x4y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y1E[];
extern void _ZN3ccc7FF3x4y13efgEv();
extern void _ZN3ccc7FF3x4y13pqrEv();
extern void _ZN3ccc7FF3x4y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y1E[] = {
  {&(_ZTVN3ccc7FF3x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y1E[];
static VTBL_ENTRY alt_thunk_names786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y1E = {  "_ZN3ccc7FF3x4y1E", // class name
  bases__ZN3ccc7FF3x4y1E, 2,
  &(vtc__ZN3ccc7FF3x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names786,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y2  : virtual ::ccc::EE3x4 {
  virtual void  efg(); // _ZN3ccc7FF3x4y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y23pqrEv
  ~FF3x4y2(); // tgen
  FF3x4y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y23efgEv");}
void  ccc::FF3x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y23abcEv");}
void  ccc::FF3x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y23pqrEv");}
ccc::FF3x4y2 ::~FF3x4y2(){ note_dtor("_ZN3ccc7FF3x4y2E", this);} // tgen
ccc::FF3x4y2 ::FF3x4y2(){ note_ctor("_ZN3ccc7FF3x4y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y2E, buf);
    ::ccc::FF3x4y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y2E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y2E);
    dp->::ccc::FF3x4y2::~FF3x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y2E(Test__ZN3ccc7FF3x4y2E, "_ZN3ccc7FF3x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y2C1Ev();
extern void _ZN3ccc7FF3x4y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y2E[] = {
  NSPAIR(_ZN3ccc7FF3x4y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y2E[];
extern void _ZN3ccc7FF3x4y23efgEv();
extern void _ZN3ccc7FF3x4y23pqrEv();
extern void _ZN3ccc7FF3x4y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y2E[] = {
  {&(_ZTVN3ccc7FF3x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y2E[];
static VTBL_ENTRY alt_thunk_names787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y2E = {  "_ZN3ccc7FF3x4y2E", // class name
  bases__ZN3ccc7FF3x4y2E, 2,
  &(vtc__ZN3ccc7FF3x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names787,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y3  : virtual ::ccc::EE3x4 {
  virtual void  efg(); // _ZN3ccc7FF3x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x4y33abcEv
  ~FF3x4y3(); // tgen
  FF3x4y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y33efgEv");}
void  ccc::FF3x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y33pqrEv");}
void  ccc::FF3x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y33abcEv");}
ccc::FF3x4y3 ::~FF3x4y3(){ note_dtor("_ZN3ccc7FF3x4y3E", this);} // tgen
ccc::FF3x4y3 ::FF3x4y3(){ note_ctor("_ZN3ccc7FF3x4y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y3E, buf);
    ::ccc::FF3x4y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y3E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y3E);
    dp->::ccc::FF3x4y3::~FF3x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y3E(Test__ZN3ccc7FF3x4y3E, "_ZN3ccc7FF3x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y3C1Ev();
extern void _ZN3ccc7FF3x4y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y3E[] = {
  NSPAIR(_ZN3ccc7FF3x4y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y3E[];
extern void _ZN3ccc7FF3x4y33efgEv();
extern void _ZN3ccc7FF3x4y33pqrEv();
extern void _ZN3ccc7FF3x4y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y3E[] = {
  {&(_ZTVN3ccc7FF3x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y3E[];
static VTBL_ENTRY alt_thunk_names788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y3E = {  "_ZN3ccc7FF3x4y3E", // class name
  bases__ZN3ccc7FF3x4y3E, 2,
  &(vtc__ZN3ccc7FF3x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names788,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y4  : virtual ::ccc::EE3x4 {
  virtual void  pqr(); // _ZN3ccc7FF3x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x4y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x4y43efgEv
  ~FF3x4y4(); // tgen
  FF3x4y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y43pqrEv");}
void  ccc::FF3x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y43abcEv");}
void  ccc::FF3x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y43efgEv");}
ccc::FF3x4y4 ::~FF3x4y4(){ note_dtor("_ZN3ccc7FF3x4y4E", this);} // tgen
ccc::FF3x4y4 ::FF3x4y4(){ note_ctor("_ZN3ccc7FF3x4y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y4E, buf);
    ::ccc::FF3x4y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y4E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y4E);
    dp->::ccc::FF3x4y4::~FF3x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y4E(Test__ZN3ccc7FF3x4y4E, "_ZN3ccc7FF3x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y4C1Ev();
extern void _ZN3ccc7FF3x4y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y4E[] = {
  NSPAIR(_ZN3ccc7FF3x4y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y4E[];
extern void _ZN3ccc7FF3x4y43efgEv();
extern void _ZN3ccc7FF3x4y43pqrEv();
extern void _ZN3ccc7FF3x4y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y4E[] = {
  {&(_ZTVN3ccc7FF3x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y4E[];
static VTBL_ENTRY alt_thunk_names789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y4E = {  "_ZN3ccc7FF3x4y4E", // class name
  bases__ZN3ccc7FF3x4y4E, 2,
  &(vtc__ZN3ccc7FF3x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names789,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y5  : virtual ::ccc::EE3x4 {
  virtual void  pqr(); // _ZN3ccc7FF3x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x4y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x4y53abcEv
  ~FF3x4y5(); // tgen
  FF3x4y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y53pqrEv");}
void  ccc::FF3x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y53efgEv");}
void  ccc::FF3x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y53abcEv");}
ccc::FF3x4y5 ::~FF3x4y5(){ note_dtor("_ZN3ccc7FF3x4y5E", this);} // tgen
ccc::FF3x4y5 ::FF3x4y5(){ note_ctor("_ZN3ccc7FF3x4y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y5E, buf);
    ::ccc::FF3x4y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y5E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y5E);
    dp->::ccc::FF3x4y5::~FF3x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y5E(Test__ZN3ccc7FF3x4y5E, "_ZN3ccc7FF3x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y5C1Ev();
extern void _ZN3ccc7FF3x4y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y5E[] = {
  NSPAIR(_ZN3ccc7FF3x4y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y5E[];
extern void _ZN3ccc7FF3x4y53efgEv();
extern void _ZN3ccc7FF3x4y53pqrEv();
extern void _ZN3ccc7FF3x4y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y5E[] = {
  {&(_ZTVN3ccc7FF3x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y5E[];
static VTBL_ENTRY alt_thunk_names790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y5E = {  "_ZN3ccc7FF3x4y5E", // class name
  bases__ZN3ccc7FF3x4y5E, 2,
  &(vtc__ZN3ccc7FF3x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names790,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y6  : virtual ::ccc::EE3x4 {
  virtual void  abc(); // _ZN3ccc7FF3x4y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x4y63efgEv
  ~FF3x4y6(); // tgen
  FF3x4y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y63abcEv");}
void  ccc::FF3x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y63efgEv");}
ccc::FF3x4y6 ::~FF3x4y6(){ note_dtor("_ZN3ccc7FF3x4y6E", this);} // tgen
ccc::FF3x4y6 ::FF3x4y6(){ note_ctor("_ZN3ccc7FF3x4y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y6E, buf);
    ::ccc::FF3x4y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y6E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y6E);
    dp->::ccc::FF3x4y6::~FF3x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y6E(Test__ZN3ccc7FF3x4y6E, "_ZN3ccc7FF3x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y6C1Ev();
extern void _ZN3ccc7FF3x4y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y6E[] = {
  NSPAIR(_ZN3ccc7FF3x4y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y6E[];
extern void _ZN3ccc7FF3x4y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x4y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y6E[] = {
  {&(_ZTVN3ccc7FF3x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y6E[];
static VTBL_ENTRY alt_thunk_names791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y6E = {  "_ZN3ccc7FF3x4y6E", // class name
  bases__ZN3ccc7FF3x4y6E, 2,
  &(vtc__ZN3ccc7FF3x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names791,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y7  : virtual ::ccc::EE3x4 {
  virtual void  abc(); // _ZN3ccc7FF3x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y73pqrEv
  ~FF3x4y7(); // tgen
  FF3x4y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y73abcEv");}
void  ccc::FF3x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y73pqrEv");}
ccc::FF3x4y7 ::~FF3x4y7(){ note_dtor("_ZN3ccc7FF3x4y7E", this);} // tgen
ccc::FF3x4y7 ::FF3x4y7(){ note_ctor("_ZN3ccc7FF3x4y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y7E, buf);
    ::ccc::FF3x4y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y7E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y7E);
    dp->::ccc::FF3x4y7::~FF3x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y7E(Test__ZN3ccc7FF3x4y7E, "_ZN3ccc7FF3x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y7C1Ev();
extern void _ZN3ccc7FF3x4y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y7E[] = {
  NSPAIR(_ZN3ccc7FF3x4y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x4y73pqrEv();
extern void _ZN3ccc7FF3x4y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y7E[] = {
  {&(_ZTVN3ccc7FF3x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y7E[];
static VTBL_ENTRY alt_thunk_names792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y7E = {  "_ZN3ccc7FF3x4y7E", // class name
  bases__ZN3ccc7FF3x4y7E, 2,
  &(vtc__ZN3ccc7FF3x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names792,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y8  : virtual ::ccc::EE3x4 {
  virtual void  efg(); // _ZN3ccc7FF3x4y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x4y83abcEv
  ~FF3x4y8(); // tgen
  FF3x4y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y83efgEv");}
void  ccc::FF3x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x4y83abcEv");}
ccc::FF3x4y8 ::~FF3x4y8(){ note_dtor("_ZN3ccc7FF3x4y8E", this);} // tgen
ccc::FF3x4y8 ::FF3x4y8(){ note_ctor("_ZN3ccc7FF3x4y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y8E, buf);
    ::ccc::FF3x4y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y8E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y8E);
    dp->::ccc::FF3x4y8::~FF3x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y8E(Test__ZN3ccc7FF3x4y8E, "_ZN3ccc7FF3x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y8C1Ev();
extern void _ZN3ccc7FF3x4y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y8E[] = {
  NSPAIR(_ZN3ccc7FF3x4y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y8E[];
extern void _ZN3ccc7FF3x4y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x4y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y8E[] = {
  {&(_ZTVN3ccc7FF3x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y8E[];
static VTBL_ENTRY alt_thunk_names793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y8E = {  "_ZN3ccc7FF3x4y8E", // class name
  bases__ZN3ccc7FF3x4y8E, 2,
  &(vtc__ZN3ccc7FF3x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names793,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y9  : virtual ::ccc::EE3x4 {
  virtual void  efg(); // _ZN3ccc7FF3x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x4y93pqrEv
  ~FF3x4y9(); // tgen
  FF3x4y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x4y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x4y93efgEv");}
void  ccc::FF3x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x4y93pqrEv");}
ccc::FF3x4y9 ::~FF3x4y9(){ note_dtor("_ZN3ccc7FF3x4y9E", this);} // tgen
ccc::FF3x4y9 ::FF3x4y9(){ note_ctor("_ZN3ccc7FF3x4y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x4y9E, buf);
    ::ccc::FF3x4y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x4y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y9E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc7FF3x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x4y9E);
    dp->::ccc::FF3x4y9::~FF3x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x4y9E(Test__ZN3ccc7FF3x4y9E, "_ZN3ccc7FF3x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x4y9C1Ev();
extern void _ZN3ccc7FF3x4y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x4y9E[] = {
  NSPAIR(_ZN3ccc7FF3x4y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc7FF3x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y9E[];
extern void _ZN3ccc7FF3x4y93efgEv();
extern void _ZN3ccc7FF3x4y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x4y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x4y9E[] = {
  {&(_ZTVN3ccc7FF3x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x4y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_7FF3x4y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x4y9E[];
static VTBL_ENTRY alt_thunk_names794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x4y9E = {  "_ZN3ccc7FF3x4y9E", // class name
  bases__ZN3ccc7FF3x4y9E, 2,
  &(vtc__ZN3ccc7FF3x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x4y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x4y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x4y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x4y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names794,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y10  : virtual ::ccc::EE3x4 {
  virtual void  pqr(); // _ZN3ccc8FF3x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x4y103abcEv
  ~FF3x4y10(); // tgen
  FF3x4y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x4y103pqrEv");}
void  ccc::FF3x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x4y103abcEv");}
ccc::FF3x4y10 ::~FF3x4y10(){ note_dtor("_ZN3ccc8FF3x4y10E", this);} // tgen
ccc::FF3x4y10 ::FF3x4y10(){ note_ctor("_ZN3ccc8FF3x4y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y10E, buf);
    ::ccc::FF3x4y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y10E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y10E);
    dp->::ccc::FF3x4y10::~FF3x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y10E(Test__ZN3ccc8FF3x4y10E, "_ZN3ccc8FF3x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y10C1Ev();
extern void _ZN3ccc8FF3x4y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y10E[] = {
  NSPAIR(_ZN3ccc8FF3x4y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x4y103pqrEv();
extern void _ZN3ccc8FF3x4y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y10E[] = {
  {&(_ZTVN3ccc8FF3x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y10E[];
static VTBL_ENTRY alt_thunk_names795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y10E = {  "_ZN3ccc8FF3x4y10E", // class name
  bases__ZN3ccc8FF3x4y10E, 2,
  &(vtc__ZN3ccc8FF3x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names795,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y11  : virtual ::ccc::EE3x4 {
  virtual void  pqr(); // _ZN3ccc8FF3x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x4y113efgEv
  ~FF3x4y11(); // tgen
  FF3x4y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x4y113pqrEv");}
void  ccc::FF3x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x4y113efgEv");}
ccc::FF3x4y11 ::~FF3x4y11(){ note_dtor("_ZN3ccc8FF3x4y11E", this);} // tgen
ccc::FF3x4y11 ::FF3x4y11(){ note_ctor("_ZN3ccc8FF3x4y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y11E, buf);
    ::ccc::FF3x4y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y11E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y11E);
    dp->::ccc::FF3x4y11::~FF3x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y11E(Test__ZN3ccc8FF3x4y11E, "_ZN3ccc8FF3x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y11C1Ev();
extern void _ZN3ccc8FF3x4y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y11E[] = {
  NSPAIR(_ZN3ccc8FF3x4y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y11E[];
extern void _ZN3ccc8FF3x4y113efgEv();
extern void _ZN3ccc8FF3x4y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y11E[] = {
  {&(_ZTVN3ccc8FF3x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y11E[];
static VTBL_ENTRY alt_thunk_names796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y11E = {  "_ZN3ccc8FF3x4y11E", // class name
  bases__ZN3ccc8FF3x4y11E, 2,
  &(vtc__ZN3ccc8FF3x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names796,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y12  : virtual ::ccc::EE3x4 {
  virtual void  abc(); // _ZN3ccc8FF3x4y123abcEv
  ~FF3x4y12(); // tgen
  FF3x4y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x4y123abcEv");}
ccc::FF3x4y12 ::~FF3x4y12(){ note_dtor("_ZN3ccc8FF3x4y12E", this);} // tgen
ccc::FF3x4y12 ::FF3x4y12(){ note_ctor("_ZN3ccc8FF3x4y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y12E, buf);
    ::ccc::FF3x4y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y12E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y12E);
    dp->::ccc::FF3x4y12::~FF3x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y12E(Test__ZN3ccc8FF3x4y12E, "_ZN3ccc8FF3x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y12C1Ev();
extern void _ZN3ccc8FF3x4y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y12E[] = {
  NSPAIR(_ZN3ccc8FF3x4y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x4y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y12E[] = {
  {&(_ZTVN3ccc8FF3x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y12E[];
static VTBL_ENTRY alt_thunk_names797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y12E = {  "_ZN3ccc8FF3x4y12E", // class name
  bases__ZN3ccc8FF3x4y12E, 2,
  &(vtc__ZN3ccc8FF3x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names797,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y13  : virtual ::ccc::EE3x4 {
  virtual void  efg(); // _ZN3ccc8FF3x4y133efgEv
  ~FF3x4y13(); // tgen
  FF3x4y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x4y133efgEv");}
ccc::FF3x4y13 ::~FF3x4y13(){ note_dtor("_ZN3ccc8FF3x4y13E", this);} // tgen
ccc::FF3x4y13 ::FF3x4y13(){ note_ctor("_ZN3ccc8FF3x4y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y13E, buf);
    ::ccc::FF3x4y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y13E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y13E);
    dp->::ccc::FF3x4y13::~FF3x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y13E(Test__ZN3ccc8FF3x4y13E, "_ZN3ccc8FF3x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y13C1Ev();
extern void _ZN3ccc8FF3x4y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y13E[] = {
  NSPAIR(_ZN3ccc8FF3x4y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y13E[];
extern void _ZN3ccc8FF3x4y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y13E[] = {
  {&(_ZTVN3ccc8FF3x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y13E[];
static VTBL_ENTRY alt_thunk_names798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y13E = {  "_ZN3ccc8FF3x4y13E", // class name
  bases__ZN3ccc8FF3x4y13E, 2,
  &(vtc__ZN3ccc8FF3x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names798,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y14  : virtual ::ccc::EE3x4 {
  virtual void  pqr(); // _ZN3ccc8FF3x4y143pqrEv
  ~FF3x4y14(); // tgen
  FF3x4y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x4y143pqrEv");}
ccc::FF3x4y14 ::~FF3x4y14(){ note_dtor("_ZN3ccc8FF3x4y14E", this);} // tgen
ccc::FF3x4y14 ::FF3x4y14(){ note_ctor("_ZN3ccc8FF3x4y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y14E, buf);
    ::ccc::FF3x4y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y14E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y14E);
    dp->::ccc::FF3x4y14::~FF3x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y14E(Test__ZN3ccc8FF3x4y14E, "_ZN3ccc8FF3x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y14C1Ev();
extern void _ZN3ccc8FF3x4y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y14E[] = {
  NSPAIR(_ZN3ccc8FF3x4y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x4y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x4y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y14E[] = {
  {&(_ZTVN3ccc8FF3x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y14E[];
static VTBL_ENTRY alt_thunk_names799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y14E = {  "_ZN3ccc8FF3x4y14E", // class name
  bases__ZN3ccc8FF3x4y14E, 2,
  &(vtc__ZN3ccc8FF3x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names799,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x4y15  : virtual ::ccc::EE3x4 {
  ~FF3x4y15(); // tgen
  FF3x4y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x4y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x4y15 ::~FF3x4y15(){ note_dtor("_ZN3ccc8FF3x4y15E", this);} // tgen
ccc::FF3x4y15 ::FF3x4y15(){ note_ctor("_ZN3ccc8FF3x4y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x4y15E, buf);
    ::ccc::FF3x4y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x4y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y15E");
    check_base_class_offset(lv, (::ccc::EE3x4*), 0, "_ZN3ccc8FF3x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x4y15E);
    dp->::ccc::FF3x4y15::~FF3x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x4y15E(Test__ZN3ccc8FF3x4y15E, "_ZN3ccc8FF3x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x4y15C1Ev();
extern void _ZN3ccc8FF3x4y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x4y15E[] = {
  NSPAIR(_ZN3ccc8FF3x4y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x4E[];
static Base_Class bases__ZN3ccc8FF3x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x4y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv)();
extern void _ZN3ccc5EE3x43efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv)();
extern void _ZN3ccc5EE3x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv)();
extern void _ZN3ccc5EE3x43abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x4y15E[] = {
  {&(_ZTVN3ccc8FF3x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x4y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x4E__NS_8FF3x4y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x4y15E[];
static VTBL_ENTRY alt_thunk_names800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x43abcEv,_ZTv0_n20_N3ccc5EE3x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x43pqrEv,_ZTv0_n16_N3ccc5EE3x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x43efgEv,_ZTv0_n12_N3ccc5EE3x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x4y15E = {  "_ZN3ccc8FF3x4y15E", // class name
  bases__ZN3ccc8FF3x4y15E, 2,
  &(vtc__ZN3ccc8FF3x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x4y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x4y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x4y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x4y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names800,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y0  : virtual ::ccc::EE3x5 {
  virtual void  abc(); // _ZN3ccc7FF3x5y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y03pqrEv
  ~FF3x5y0(); // tgen
  FF3x5y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y03abcEv");}
void  ccc::FF3x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y03efgEv");}
void  ccc::FF3x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y03pqrEv");}
ccc::FF3x5y0 ::~FF3x5y0(){ note_dtor("_ZN3ccc7FF3x5y0E", this);} // tgen
ccc::FF3x5y0 ::FF3x5y0(){ note_ctor("_ZN3ccc7FF3x5y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y0E, buf);
    ::ccc::FF3x5y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y0E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y0E);
    dp->::ccc::FF3x5y0::~FF3x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y0E(Test__ZN3ccc7FF3x5y0E, "_ZN3ccc7FF3x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y0C1Ev();
extern void _ZN3ccc7FF3x5y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y0E[] = {
  NSPAIR(_ZN3ccc7FF3x5y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y0E[];
extern void _ZN3ccc7FF3x5y03efgEv();
extern void _ZN3ccc7FF3x5y03pqrEv();
extern void _ZN3ccc7FF3x5y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y0E[] = {
  {&(_ZTVN3ccc7FF3x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y0E[];
static VTBL_ENTRY alt_thunk_names801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y0E = {  "_ZN3ccc7FF3x5y0E", // class name
  bases__ZN3ccc7FF3x5y0E, 2,
  &(vtc__ZN3ccc7FF3x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names801,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y1  : virtual ::ccc::EE3x5 {
  virtual void  abc(); // _ZN3ccc7FF3x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x5y13efgEv
  ~FF3x5y1(); // tgen
  FF3x5y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y13abcEv");}
void  ccc::FF3x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y13pqrEv");}
void  ccc::FF3x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y13efgEv");}
ccc::FF3x5y1 ::~FF3x5y1(){ note_dtor("_ZN3ccc7FF3x5y1E", this);} // tgen
ccc::FF3x5y1 ::FF3x5y1(){ note_ctor("_ZN3ccc7FF3x5y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y1E, buf);
    ::ccc::FF3x5y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y1E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y1E);
    dp->::ccc::FF3x5y1::~FF3x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y1E(Test__ZN3ccc7FF3x5y1E, "_ZN3ccc7FF3x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y1C1Ev();
extern void _ZN3ccc7FF3x5y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y1E[] = {
  NSPAIR(_ZN3ccc7FF3x5y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y1E[];
extern void _ZN3ccc7FF3x5y13efgEv();
extern void _ZN3ccc7FF3x5y13pqrEv();
extern void _ZN3ccc7FF3x5y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y1E[] = {
  {&(_ZTVN3ccc7FF3x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y1E[];
static VTBL_ENTRY alt_thunk_names802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y1E = {  "_ZN3ccc7FF3x5y1E", // class name
  bases__ZN3ccc7FF3x5y1E, 2,
  &(vtc__ZN3ccc7FF3x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names802,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y2  : virtual ::ccc::EE3x5 {
  virtual void  efg(); // _ZN3ccc7FF3x5y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y23pqrEv
  ~FF3x5y2(); // tgen
  FF3x5y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y23efgEv");}
void  ccc::FF3x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y23abcEv");}
void  ccc::FF3x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y23pqrEv");}
ccc::FF3x5y2 ::~FF3x5y2(){ note_dtor("_ZN3ccc7FF3x5y2E", this);} // tgen
ccc::FF3x5y2 ::FF3x5y2(){ note_ctor("_ZN3ccc7FF3x5y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y2E, buf);
    ::ccc::FF3x5y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y2E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y2E);
    dp->::ccc::FF3x5y2::~FF3x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y2E(Test__ZN3ccc7FF3x5y2E, "_ZN3ccc7FF3x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y2C1Ev();
extern void _ZN3ccc7FF3x5y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y2E[] = {
  NSPAIR(_ZN3ccc7FF3x5y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y2E[];
extern void _ZN3ccc7FF3x5y23efgEv();
extern void _ZN3ccc7FF3x5y23pqrEv();
extern void _ZN3ccc7FF3x5y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y2E[] = {
  {&(_ZTVN3ccc7FF3x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y2E[];
static VTBL_ENTRY alt_thunk_names803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y2E = {  "_ZN3ccc7FF3x5y2E", // class name
  bases__ZN3ccc7FF3x5y2E, 2,
  &(vtc__ZN3ccc7FF3x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names803,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y3  : virtual ::ccc::EE3x5 {
  virtual void  efg(); // _ZN3ccc7FF3x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x5y33abcEv
  ~FF3x5y3(); // tgen
  FF3x5y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y33efgEv");}
void  ccc::FF3x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y33pqrEv");}
void  ccc::FF3x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y33abcEv");}
ccc::FF3x5y3 ::~FF3x5y3(){ note_dtor("_ZN3ccc7FF3x5y3E", this);} // tgen
ccc::FF3x5y3 ::FF3x5y3(){ note_ctor("_ZN3ccc7FF3x5y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y3E, buf);
    ::ccc::FF3x5y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y3E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y3E);
    dp->::ccc::FF3x5y3::~FF3x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y3E(Test__ZN3ccc7FF3x5y3E, "_ZN3ccc7FF3x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y3C1Ev();
extern void _ZN3ccc7FF3x5y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y3E[] = {
  NSPAIR(_ZN3ccc7FF3x5y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y3E[];
extern void _ZN3ccc7FF3x5y33efgEv();
extern void _ZN3ccc7FF3x5y33pqrEv();
extern void _ZN3ccc7FF3x5y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y3E[] = {
  {&(_ZTVN3ccc7FF3x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y3E[];
static VTBL_ENTRY alt_thunk_names804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y3E = {  "_ZN3ccc7FF3x5y3E", // class name
  bases__ZN3ccc7FF3x5y3E, 2,
  &(vtc__ZN3ccc7FF3x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names804,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y4  : virtual ::ccc::EE3x5 {
  virtual void  pqr(); // _ZN3ccc7FF3x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x5y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x5y43efgEv
  ~FF3x5y4(); // tgen
  FF3x5y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y43pqrEv");}
void  ccc::FF3x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y43abcEv");}
void  ccc::FF3x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y43efgEv");}
ccc::FF3x5y4 ::~FF3x5y4(){ note_dtor("_ZN3ccc7FF3x5y4E", this);} // tgen
ccc::FF3x5y4 ::FF3x5y4(){ note_ctor("_ZN3ccc7FF3x5y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y4E, buf);
    ::ccc::FF3x5y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y4E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y4E);
    dp->::ccc::FF3x5y4::~FF3x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y4E(Test__ZN3ccc7FF3x5y4E, "_ZN3ccc7FF3x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y4C1Ev();
extern void _ZN3ccc7FF3x5y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y4E[] = {
  NSPAIR(_ZN3ccc7FF3x5y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y4E[];
extern void _ZN3ccc7FF3x5y43efgEv();
extern void _ZN3ccc7FF3x5y43pqrEv();
extern void _ZN3ccc7FF3x5y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y4E[] = {
  {&(_ZTVN3ccc7FF3x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y4E[];
static VTBL_ENTRY alt_thunk_names805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y4E = {  "_ZN3ccc7FF3x5y4E", // class name
  bases__ZN3ccc7FF3x5y4E, 2,
  &(vtc__ZN3ccc7FF3x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names805,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y5  : virtual ::ccc::EE3x5 {
  virtual void  pqr(); // _ZN3ccc7FF3x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x5y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x5y53abcEv
  ~FF3x5y5(); // tgen
  FF3x5y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y53pqrEv");}
void  ccc::FF3x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y53efgEv");}
void  ccc::FF3x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y53abcEv");}
ccc::FF3x5y5 ::~FF3x5y5(){ note_dtor("_ZN3ccc7FF3x5y5E", this);} // tgen
ccc::FF3x5y5 ::FF3x5y5(){ note_ctor("_ZN3ccc7FF3x5y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y5E, buf);
    ::ccc::FF3x5y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y5E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y5E);
    dp->::ccc::FF3x5y5::~FF3x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y5E(Test__ZN3ccc7FF3x5y5E, "_ZN3ccc7FF3x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y5C1Ev();
extern void _ZN3ccc7FF3x5y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y5E[] = {
  NSPAIR(_ZN3ccc7FF3x5y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y5E[];
extern void _ZN3ccc7FF3x5y53efgEv();
extern void _ZN3ccc7FF3x5y53pqrEv();
extern void _ZN3ccc7FF3x5y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y5E[] = {
  {&(_ZTVN3ccc7FF3x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y5E[];
static VTBL_ENTRY alt_thunk_names806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y5E = {  "_ZN3ccc7FF3x5y5E", // class name
  bases__ZN3ccc7FF3x5y5E, 2,
  &(vtc__ZN3ccc7FF3x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names806,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y6  : virtual ::ccc::EE3x5 {
  virtual void  abc(); // _ZN3ccc7FF3x5y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x5y63efgEv
  ~FF3x5y6(); // tgen
  FF3x5y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y63abcEv");}
void  ccc::FF3x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y63efgEv");}
ccc::FF3x5y6 ::~FF3x5y6(){ note_dtor("_ZN3ccc7FF3x5y6E", this);} // tgen
ccc::FF3x5y6 ::FF3x5y6(){ note_ctor("_ZN3ccc7FF3x5y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y6E, buf);
    ::ccc::FF3x5y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y6E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y6E);
    dp->::ccc::FF3x5y6::~FF3x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y6E(Test__ZN3ccc7FF3x5y6E, "_ZN3ccc7FF3x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y6C1Ev();
extern void _ZN3ccc7FF3x5y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y6E[] = {
  NSPAIR(_ZN3ccc7FF3x5y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y6E[];
extern void _ZN3ccc7FF3x5y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x5y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y6E[] = {
  {&(_ZTVN3ccc7FF3x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y6E[];
static VTBL_ENTRY alt_thunk_names807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y6E = {  "_ZN3ccc7FF3x5y6E", // class name
  bases__ZN3ccc7FF3x5y6E, 2,
  &(vtc__ZN3ccc7FF3x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names807,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y7  : virtual ::ccc::EE3x5 {
  virtual void  abc(); // _ZN3ccc7FF3x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y73pqrEv
  ~FF3x5y7(); // tgen
  FF3x5y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y73abcEv");}
void  ccc::FF3x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y73pqrEv");}
ccc::FF3x5y7 ::~FF3x5y7(){ note_dtor("_ZN3ccc7FF3x5y7E", this);} // tgen
ccc::FF3x5y7 ::FF3x5y7(){ note_ctor("_ZN3ccc7FF3x5y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y7E, buf);
    ::ccc::FF3x5y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y7E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y7E);
    dp->::ccc::FF3x5y7::~FF3x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y7E(Test__ZN3ccc7FF3x5y7E, "_ZN3ccc7FF3x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y7C1Ev();
extern void _ZN3ccc7FF3x5y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y7E[] = {
  NSPAIR(_ZN3ccc7FF3x5y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x5y73pqrEv();
extern void _ZN3ccc7FF3x5y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y7E[] = {
  {&(_ZTVN3ccc7FF3x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y7E[];
static VTBL_ENTRY alt_thunk_names808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y7E = {  "_ZN3ccc7FF3x5y7E", // class name
  bases__ZN3ccc7FF3x5y7E, 2,
  &(vtc__ZN3ccc7FF3x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names808,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y8  : virtual ::ccc::EE3x5 {
  virtual void  efg(); // _ZN3ccc7FF3x5y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x5y83abcEv
  ~FF3x5y8(); // tgen
  FF3x5y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y83efgEv");}
void  ccc::FF3x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x5y83abcEv");}
ccc::FF3x5y8 ::~FF3x5y8(){ note_dtor("_ZN3ccc7FF3x5y8E", this);} // tgen
ccc::FF3x5y8 ::FF3x5y8(){ note_ctor("_ZN3ccc7FF3x5y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y8E, buf);
    ::ccc::FF3x5y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y8E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y8E);
    dp->::ccc::FF3x5y8::~FF3x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y8E(Test__ZN3ccc7FF3x5y8E, "_ZN3ccc7FF3x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y8C1Ev();
extern void _ZN3ccc7FF3x5y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y8E[] = {
  NSPAIR(_ZN3ccc7FF3x5y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y8E[];
extern void _ZN3ccc7FF3x5y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x5y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y8E[] = {
  {&(_ZTVN3ccc7FF3x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y8E[];
static VTBL_ENTRY alt_thunk_names809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y8E = {  "_ZN3ccc7FF3x5y8E", // class name
  bases__ZN3ccc7FF3x5y8E, 2,
  &(vtc__ZN3ccc7FF3x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names809,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y9  : virtual ::ccc::EE3x5 {
  virtual void  efg(); // _ZN3ccc7FF3x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x5y93pqrEv
  ~FF3x5y9(); // tgen
  FF3x5y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x5y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x5y93efgEv");}
void  ccc::FF3x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x5y93pqrEv");}
ccc::FF3x5y9 ::~FF3x5y9(){ note_dtor("_ZN3ccc7FF3x5y9E", this);} // tgen
ccc::FF3x5y9 ::FF3x5y9(){ note_ctor("_ZN3ccc7FF3x5y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x5y9E, buf);
    ::ccc::FF3x5y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x5y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y9E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc7FF3x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x5y9E);
    dp->::ccc::FF3x5y9::~FF3x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x5y9E(Test__ZN3ccc7FF3x5y9E, "_ZN3ccc7FF3x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x5y9C1Ev();
extern void _ZN3ccc7FF3x5y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x5y9E[] = {
  NSPAIR(_ZN3ccc7FF3x5y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc7FF3x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y9E[];
extern void _ZN3ccc7FF3x5y93efgEv();
extern void _ZN3ccc7FF3x5y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x5y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x5y9E[] = {
  {&(_ZTVN3ccc7FF3x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x5y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_7FF3x5y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x5y9E[];
static VTBL_ENTRY alt_thunk_names810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x5y9E = {  "_ZN3ccc7FF3x5y9E", // class name
  bases__ZN3ccc7FF3x5y9E, 2,
  &(vtc__ZN3ccc7FF3x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x5y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x5y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x5y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x5y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names810,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y10  : virtual ::ccc::EE3x5 {
  virtual void  pqr(); // _ZN3ccc8FF3x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x5y103abcEv
  ~FF3x5y10(); // tgen
  FF3x5y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x5y103pqrEv");}
void  ccc::FF3x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x5y103abcEv");}
ccc::FF3x5y10 ::~FF3x5y10(){ note_dtor("_ZN3ccc8FF3x5y10E", this);} // tgen
ccc::FF3x5y10 ::FF3x5y10(){ note_ctor("_ZN3ccc8FF3x5y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y10E, buf);
    ::ccc::FF3x5y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y10E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y10E);
    dp->::ccc::FF3x5y10::~FF3x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y10E(Test__ZN3ccc8FF3x5y10E, "_ZN3ccc8FF3x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y10C1Ev();
extern void _ZN3ccc8FF3x5y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y10E[] = {
  NSPAIR(_ZN3ccc8FF3x5y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x5y103pqrEv();
extern void _ZN3ccc8FF3x5y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y10E[] = {
  {&(_ZTVN3ccc8FF3x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y10E[];
static VTBL_ENTRY alt_thunk_names811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y10E = {  "_ZN3ccc8FF3x5y10E", // class name
  bases__ZN3ccc8FF3x5y10E, 2,
  &(vtc__ZN3ccc8FF3x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names811,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y11  : virtual ::ccc::EE3x5 {
  virtual void  pqr(); // _ZN3ccc8FF3x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x5y113efgEv
  ~FF3x5y11(); // tgen
  FF3x5y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x5y113pqrEv");}
void  ccc::FF3x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x5y113efgEv");}
ccc::FF3x5y11 ::~FF3x5y11(){ note_dtor("_ZN3ccc8FF3x5y11E", this);} // tgen
ccc::FF3x5y11 ::FF3x5y11(){ note_ctor("_ZN3ccc8FF3x5y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y11E, buf);
    ::ccc::FF3x5y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y11E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y11E);
    dp->::ccc::FF3x5y11::~FF3x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y11E(Test__ZN3ccc8FF3x5y11E, "_ZN3ccc8FF3x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y11C1Ev();
extern void _ZN3ccc8FF3x5y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y11E[] = {
  NSPAIR(_ZN3ccc8FF3x5y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y11E[];
extern void _ZN3ccc8FF3x5y113efgEv();
extern void _ZN3ccc8FF3x5y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y11E[] = {
  {&(_ZTVN3ccc8FF3x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y11E[];
static VTBL_ENTRY alt_thunk_names812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y11E = {  "_ZN3ccc8FF3x5y11E", // class name
  bases__ZN3ccc8FF3x5y11E, 2,
  &(vtc__ZN3ccc8FF3x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names812,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y12  : virtual ::ccc::EE3x5 {
  virtual void  abc(); // _ZN3ccc8FF3x5y123abcEv
  ~FF3x5y12(); // tgen
  FF3x5y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF3x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x5y123abcEv");}
ccc::FF3x5y12 ::~FF3x5y12(){ note_dtor("_ZN3ccc8FF3x5y12E", this);} // tgen
ccc::FF3x5y12 ::FF3x5y12(){ note_ctor("_ZN3ccc8FF3x5y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y12E, buf);
    ::ccc::FF3x5y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y12E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y12E);
    dp->::ccc::FF3x5y12::~FF3x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y12E(Test__ZN3ccc8FF3x5y12E, "_ZN3ccc8FF3x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y12C1Ev();
extern void _ZN3ccc8FF3x5y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y12E[] = {
  NSPAIR(_ZN3ccc8FF3x5y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x5y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y12E[] = {
  {&(_ZTVN3ccc8FF3x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y12E[];
static VTBL_ENTRY alt_thunk_names813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y12E = {  "_ZN3ccc8FF3x5y12E", // class name
  bases__ZN3ccc8FF3x5y12E, 2,
  &(vtc__ZN3ccc8FF3x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names813,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y13  : virtual ::ccc::EE3x5 {
  virtual void  efg(); // _ZN3ccc8FF3x5y133efgEv
  ~FF3x5y13(); // tgen
  FF3x5y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF3x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x5y133efgEv");}
ccc::FF3x5y13 ::~FF3x5y13(){ note_dtor("_ZN3ccc8FF3x5y13E", this);} // tgen
ccc::FF3x5y13 ::FF3x5y13(){ note_ctor("_ZN3ccc8FF3x5y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y13E, buf);
    ::ccc::FF3x5y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y13E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y13E);
    dp->::ccc::FF3x5y13::~FF3x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y13E(Test__ZN3ccc8FF3x5y13E, "_ZN3ccc8FF3x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y13C1Ev();
extern void _ZN3ccc8FF3x5y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y13E[] = {
  NSPAIR(_ZN3ccc8FF3x5y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y13E[];
extern void _ZN3ccc8FF3x5y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y13E[] = {
  {&(_ZTVN3ccc8FF3x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y13E[];
static VTBL_ENTRY alt_thunk_names814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y13E = {  "_ZN3ccc8FF3x5y13E", // class name
  bases__ZN3ccc8FF3x5y13E, 2,
  &(vtc__ZN3ccc8FF3x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names814,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y14  : virtual ::ccc::EE3x5 {
  virtual void  pqr(); // _ZN3ccc8FF3x5y143pqrEv
  ~FF3x5y14(); // tgen
  FF3x5y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x5y143pqrEv");}
ccc::FF3x5y14 ::~FF3x5y14(){ note_dtor("_ZN3ccc8FF3x5y14E", this);} // tgen
ccc::FF3x5y14 ::FF3x5y14(){ note_ctor("_ZN3ccc8FF3x5y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y14E, buf);
    ::ccc::FF3x5y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y14E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y14E);
    dp->::ccc::FF3x5y14::~FF3x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y14E(Test__ZN3ccc8FF3x5y14E, "_ZN3ccc8FF3x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y14C1Ev();
extern void _ZN3ccc8FF3x5y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y14E[] = {
  NSPAIR(_ZN3ccc8FF3x5y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x5y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x5y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y14E[] = {
  {&(_ZTVN3ccc8FF3x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y14E[];
static VTBL_ENTRY alt_thunk_names815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y14E = {  "_ZN3ccc8FF3x5y14E", // class name
  bases__ZN3ccc8FF3x5y14E, 2,
  &(vtc__ZN3ccc8FF3x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names815,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x5y15  : virtual ::ccc::EE3x5 {
  ~FF3x5y15(); // tgen
  FF3x5y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x5y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF3x5y15 ::~FF3x5y15(){ note_dtor("_ZN3ccc8FF3x5y15E", this);} // tgen
ccc::FF3x5y15 ::FF3x5y15(){ note_ctor("_ZN3ccc8FF3x5y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x5y15E, buf);
    ::ccc::FF3x5y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x5y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y15E");
    check_base_class_offset(lv, (::ccc::EE3x5*), 0, "_ZN3ccc8FF3x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x5y15E);
    dp->::ccc::FF3x5y15::~FF3x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x5y15E(Test__ZN3ccc8FF3x5y15E, "_ZN3ccc8FF3x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x5y15C1Ev();
extern void _ZN3ccc8FF3x5y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x5y15E[] = {
  NSPAIR(_ZN3ccc8FF3x5y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x5E[];
static Base_Class bases__ZN3ccc8FF3x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x5y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv)();
extern void _ZN3ccc5EE3x53efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv)();
extern void _ZN3ccc5EE3x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv)();
extern void _ZN3ccc5EE3x53abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x5y15E[] = {
  {&(_ZTVN3ccc8FF3x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x5y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x5E__NS_8FF3x5y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x5y15E[];
static VTBL_ENTRY alt_thunk_names816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x53abcEv,_ZTv0_n20_N3ccc5EE3x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x53pqrEv,_ZTv0_n16_N3ccc5EE3x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x53efgEv,_ZTv0_n12_N3ccc5EE3x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x5y15E = {  "_ZN3ccc8FF3x5y15E", // class name
  bases__ZN3ccc8FF3x5y15E, 2,
  &(vtc__ZN3ccc8FF3x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x5y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x5y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x5y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x5y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names816,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y0  : virtual ::ccc::EE3x6 {
  virtual void  abc(); // _ZN3ccc7FF3x6y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y03pqrEv
  ~FF3x6y0(); // tgen
  FF3x6y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y03abcEv");}
void  ccc::FF3x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y03efgEv");}
void  ccc::FF3x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y03pqrEv");}
ccc::FF3x6y0 ::~FF3x6y0(){ note_dtor("_ZN3ccc7FF3x6y0E", this);} // tgen
ccc::FF3x6y0 ::FF3x6y0(){ note_ctor("_ZN3ccc7FF3x6y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y0E, buf);
    ::ccc::FF3x6y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y0E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y0E);
    dp->::ccc::FF3x6y0::~FF3x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y0E(Test__ZN3ccc7FF3x6y0E, "_ZN3ccc7FF3x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y0C1Ev();
extern void _ZN3ccc7FF3x6y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y0E[] = {
  NSPAIR(_ZN3ccc7FF3x6y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y0E[];
extern void _ZN3ccc7FF3x6y03efgEv();
extern void _ZN3ccc7FF3x6y03pqrEv();
extern void _ZN3ccc7FF3x6y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y0E[] = {
  {&(_ZTVN3ccc7FF3x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y0E[];
static VTBL_ENTRY alt_thunk_names817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y0E = {  "_ZN3ccc7FF3x6y0E", // class name
  bases__ZN3ccc7FF3x6y0E, 2,
  &(vtc__ZN3ccc7FF3x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names817,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y1  : virtual ::ccc::EE3x6 {
  virtual void  abc(); // _ZN3ccc7FF3x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x6y13efgEv
  ~FF3x6y1(); // tgen
  FF3x6y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y13abcEv");}
void  ccc::FF3x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y13pqrEv");}
void  ccc::FF3x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y13efgEv");}
ccc::FF3x6y1 ::~FF3x6y1(){ note_dtor("_ZN3ccc7FF3x6y1E", this);} // tgen
ccc::FF3x6y1 ::FF3x6y1(){ note_ctor("_ZN3ccc7FF3x6y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y1E, buf);
    ::ccc::FF3x6y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y1E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y1E);
    dp->::ccc::FF3x6y1::~FF3x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y1E(Test__ZN3ccc7FF3x6y1E, "_ZN3ccc7FF3x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y1C1Ev();
extern void _ZN3ccc7FF3x6y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y1E[] = {
  NSPAIR(_ZN3ccc7FF3x6y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y1E[];
extern void _ZN3ccc7FF3x6y13efgEv();
extern void _ZN3ccc7FF3x6y13pqrEv();
extern void _ZN3ccc7FF3x6y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y1E[] = {
  {&(_ZTVN3ccc7FF3x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y1E[];
static VTBL_ENTRY alt_thunk_names818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y1E = {  "_ZN3ccc7FF3x6y1E", // class name
  bases__ZN3ccc7FF3x6y1E, 2,
  &(vtc__ZN3ccc7FF3x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names818,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y2  : virtual ::ccc::EE3x6 {
  virtual void  efg(); // _ZN3ccc7FF3x6y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y23pqrEv
  ~FF3x6y2(); // tgen
  FF3x6y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y23efgEv");}
void  ccc::FF3x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y23abcEv");}
void  ccc::FF3x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y23pqrEv");}
ccc::FF3x6y2 ::~FF3x6y2(){ note_dtor("_ZN3ccc7FF3x6y2E", this);} // tgen
ccc::FF3x6y2 ::FF3x6y2(){ note_ctor("_ZN3ccc7FF3x6y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y2E, buf);
    ::ccc::FF3x6y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y2E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y2E);
    dp->::ccc::FF3x6y2::~FF3x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y2E(Test__ZN3ccc7FF3x6y2E, "_ZN3ccc7FF3x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y2C1Ev();
extern void _ZN3ccc7FF3x6y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y2E[] = {
  NSPAIR(_ZN3ccc7FF3x6y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y2E[];
extern void _ZN3ccc7FF3x6y23efgEv();
extern void _ZN3ccc7FF3x6y23pqrEv();
extern void _ZN3ccc7FF3x6y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y2E[] = {
  {&(_ZTVN3ccc7FF3x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y2E[];
static VTBL_ENTRY alt_thunk_names819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y2E = {  "_ZN3ccc7FF3x6y2E", // class name
  bases__ZN3ccc7FF3x6y2E, 2,
  &(vtc__ZN3ccc7FF3x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names819,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y3  : virtual ::ccc::EE3x6 {
  virtual void  efg(); // _ZN3ccc7FF3x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x6y33abcEv
  ~FF3x6y3(); // tgen
  FF3x6y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y33efgEv");}
void  ccc::FF3x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y33pqrEv");}
void  ccc::FF3x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y33abcEv");}
ccc::FF3x6y3 ::~FF3x6y3(){ note_dtor("_ZN3ccc7FF3x6y3E", this);} // tgen
ccc::FF3x6y3 ::FF3x6y3(){ note_ctor("_ZN3ccc7FF3x6y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y3E, buf);
    ::ccc::FF3x6y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y3E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y3E);
    dp->::ccc::FF3x6y3::~FF3x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y3E(Test__ZN3ccc7FF3x6y3E, "_ZN3ccc7FF3x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y3C1Ev();
extern void _ZN3ccc7FF3x6y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y3E[] = {
  NSPAIR(_ZN3ccc7FF3x6y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y3E[];
extern void _ZN3ccc7FF3x6y33efgEv();
extern void _ZN3ccc7FF3x6y33pqrEv();
extern void _ZN3ccc7FF3x6y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y3E[] = {
  {&(_ZTVN3ccc7FF3x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y3E[];
static VTBL_ENTRY alt_thunk_names820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y3E = {  "_ZN3ccc7FF3x6y3E", // class name
  bases__ZN3ccc7FF3x6y3E, 2,
  &(vtc__ZN3ccc7FF3x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names820,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y4  : virtual ::ccc::EE3x6 {
  virtual void  pqr(); // _ZN3ccc7FF3x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x6y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x6y43efgEv
  ~FF3x6y4(); // tgen
  FF3x6y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y43pqrEv");}
void  ccc::FF3x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y43abcEv");}
void  ccc::FF3x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y43efgEv");}
ccc::FF3x6y4 ::~FF3x6y4(){ note_dtor("_ZN3ccc7FF3x6y4E", this);} // tgen
ccc::FF3x6y4 ::FF3x6y4(){ note_ctor("_ZN3ccc7FF3x6y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y4E, buf);
    ::ccc::FF3x6y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y4E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y4E);
    dp->::ccc::FF3x6y4::~FF3x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y4E(Test__ZN3ccc7FF3x6y4E, "_ZN3ccc7FF3x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y4C1Ev();
extern void _ZN3ccc7FF3x6y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y4E[] = {
  NSPAIR(_ZN3ccc7FF3x6y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y4E[];
extern void _ZN3ccc7FF3x6y43efgEv();
extern void _ZN3ccc7FF3x6y43pqrEv();
extern void _ZN3ccc7FF3x6y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y4E[] = {
  {&(_ZTVN3ccc7FF3x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y4E[];
static VTBL_ENTRY alt_thunk_names821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y4E = {  "_ZN3ccc7FF3x6y4E", // class name
  bases__ZN3ccc7FF3x6y4E, 2,
  &(vtc__ZN3ccc7FF3x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names821,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y5  : virtual ::ccc::EE3x6 {
  virtual void  pqr(); // _ZN3ccc7FF3x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x6y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x6y53abcEv
  ~FF3x6y5(); // tgen
  FF3x6y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y53pqrEv");}
void  ccc::FF3x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y53efgEv");}
void  ccc::FF3x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y53abcEv");}
ccc::FF3x6y5 ::~FF3x6y5(){ note_dtor("_ZN3ccc7FF3x6y5E", this);} // tgen
ccc::FF3x6y5 ::FF3x6y5(){ note_ctor("_ZN3ccc7FF3x6y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y5E, buf);
    ::ccc::FF3x6y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y5E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y5E);
    dp->::ccc::FF3x6y5::~FF3x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y5E(Test__ZN3ccc7FF3x6y5E, "_ZN3ccc7FF3x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y5C1Ev();
extern void _ZN3ccc7FF3x6y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y5E[] = {
  NSPAIR(_ZN3ccc7FF3x6y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y5E[];
extern void _ZN3ccc7FF3x6y53efgEv();
extern void _ZN3ccc7FF3x6y53pqrEv();
extern void _ZN3ccc7FF3x6y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y5E[] = {
  {&(_ZTVN3ccc7FF3x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y5E[];
static VTBL_ENTRY alt_thunk_names822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y5E = {  "_ZN3ccc7FF3x6y5E", // class name
  bases__ZN3ccc7FF3x6y5E, 2,
  &(vtc__ZN3ccc7FF3x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names822,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y6  : virtual ::ccc::EE3x6 {
  virtual void  abc(); // _ZN3ccc7FF3x6y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x6y63efgEv
  ~FF3x6y6(); // tgen
  FF3x6y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y63abcEv");}
void  ccc::FF3x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y63efgEv");}
ccc::FF3x6y6 ::~FF3x6y6(){ note_dtor("_ZN3ccc7FF3x6y6E", this);} // tgen
ccc::FF3x6y6 ::FF3x6y6(){ note_ctor("_ZN3ccc7FF3x6y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y6E, buf);
    ::ccc::FF3x6y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y6E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y6E);
    dp->::ccc::FF3x6y6::~FF3x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y6E(Test__ZN3ccc7FF3x6y6E, "_ZN3ccc7FF3x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y6C1Ev();
extern void _ZN3ccc7FF3x6y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y6E[] = {
  NSPAIR(_ZN3ccc7FF3x6y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y6E[];
extern void _ZN3ccc7FF3x6y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7FF3x6y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y6E[] = {
  {&(_ZTVN3ccc7FF3x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y6E[];
static VTBL_ENTRY alt_thunk_names823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y6E = {  "_ZN3ccc7FF3x6y6E", // class name
  bases__ZN3ccc7FF3x6y6E, 2,
  &(vtc__ZN3ccc7FF3x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names823,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y7  : virtual ::ccc::EE3x6 {
  virtual void  abc(); // _ZN3ccc7FF3x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y73pqrEv
  ~FF3x6y7(); // tgen
  FF3x6y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y73abcEv");}
void  ccc::FF3x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y73pqrEv");}
ccc::FF3x6y7 ::~FF3x6y7(){ note_dtor("_ZN3ccc7FF3x6y7E", this);} // tgen
ccc::FF3x6y7 ::FF3x6y7(){ note_ctor("_ZN3ccc7FF3x6y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y7E, buf);
    ::ccc::FF3x6y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y7E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y7E);
    dp->::ccc::FF3x6y7::~FF3x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y7E(Test__ZN3ccc7FF3x6y7E, "_ZN3ccc7FF3x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y7C1Ev();
extern void _ZN3ccc7FF3x6y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y7E[] = {
  NSPAIR(_ZN3ccc7FF3x6y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x6y73pqrEv();
extern void _ZN3ccc7FF3x6y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y7E[] = {
  {&(_ZTVN3ccc7FF3x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y7E[];
static VTBL_ENTRY alt_thunk_names824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y7E = {  "_ZN3ccc7FF3x6y7E", // class name
  bases__ZN3ccc7FF3x6y7E, 2,
  &(vtc__ZN3ccc7FF3x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names824,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y8  : virtual ::ccc::EE3x6 {
  virtual void  efg(); // _ZN3ccc7FF3x6y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x6y83abcEv
  ~FF3x6y8(); // tgen
  FF3x6y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y83efgEv");}
void  ccc::FF3x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x6y83abcEv");}
ccc::FF3x6y8 ::~FF3x6y8(){ note_dtor("_ZN3ccc7FF3x6y8E", this);} // tgen
ccc::FF3x6y8 ::FF3x6y8(){ note_ctor("_ZN3ccc7FF3x6y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y8E, buf);
    ::ccc::FF3x6y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y8E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y8E);
    dp->::ccc::FF3x6y8::~FF3x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y8E(Test__ZN3ccc7FF3x6y8E, "_ZN3ccc7FF3x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y8C1Ev();
extern void _ZN3ccc7FF3x6y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y8E[] = {
  NSPAIR(_ZN3ccc7FF3x6y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y8E[];
extern void _ZN3ccc7FF3x6y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7FF3x6y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y8E[] = {
  {&(_ZTVN3ccc7FF3x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y8E[];
static VTBL_ENTRY alt_thunk_names825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y8E = {  "_ZN3ccc7FF3x6y8E", // class name
  bases__ZN3ccc7FF3x6y8E, 2,
  &(vtc__ZN3ccc7FF3x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names825,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y9  : virtual ::ccc::EE3x6 {
  virtual void  efg(); // _ZN3ccc7FF3x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x6y93pqrEv
  ~FF3x6y9(); // tgen
  FF3x6y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x6y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x6y93efgEv");}
void  ccc::FF3x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x6y93pqrEv");}
ccc::FF3x6y9 ::~FF3x6y9(){ note_dtor("_ZN3ccc7FF3x6y9E", this);} // tgen
ccc::FF3x6y9 ::FF3x6y9(){ note_ctor("_ZN3ccc7FF3x6y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x6y9E, buf);
    ::ccc::FF3x6y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x6y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y9E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc7FF3x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x6y9E);
    dp->::ccc::FF3x6y9::~FF3x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x6y9E(Test__ZN3ccc7FF3x6y9E, "_ZN3ccc7FF3x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x6y9C1Ev();
extern void _ZN3ccc7FF3x6y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x6y9E[] = {
  NSPAIR(_ZN3ccc7FF3x6y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc7FF3x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y9E[];
extern void _ZN3ccc7FF3x6y93efgEv();
extern void _ZN3ccc7FF3x6y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x6y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x6y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x6y9E[] = {
  {&(_ZTVN3ccc7FF3x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x6y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_7FF3x6y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x6y9E[];
static VTBL_ENTRY alt_thunk_names826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x6y9E = {  "_ZN3ccc7FF3x6y9E", // class name
  bases__ZN3ccc7FF3x6y9E, 2,
  &(vtc__ZN3ccc7FF3x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x6y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x6y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x6y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x6y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names826,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y10  : virtual ::ccc::EE3x6 {
  virtual void  pqr(); // _ZN3ccc8FF3x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x6y103abcEv
  ~FF3x6y10(); // tgen
  FF3x6y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x6y103pqrEv");}
void  ccc::FF3x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x6y103abcEv");}
ccc::FF3x6y10 ::~FF3x6y10(){ note_dtor("_ZN3ccc8FF3x6y10E", this);} // tgen
ccc::FF3x6y10 ::FF3x6y10(){ note_ctor("_ZN3ccc8FF3x6y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y10E, buf);
    ::ccc::FF3x6y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y10E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y10E);
    dp->::ccc::FF3x6y10::~FF3x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y10E(Test__ZN3ccc8FF3x6y10E, "_ZN3ccc8FF3x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y10C1Ev();
extern void _ZN3ccc8FF3x6y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y10E[] = {
  NSPAIR(_ZN3ccc8FF3x6y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x6y103pqrEv();
extern void _ZN3ccc8FF3x6y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y10E[] = {
  {&(_ZTVN3ccc8FF3x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y10E[];
static VTBL_ENTRY alt_thunk_names827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y10E = {  "_ZN3ccc8FF3x6y10E", // class name
  bases__ZN3ccc8FF3x6y10E, 2,
  &(vtc__ZN3ccc8FF3x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names827,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y11  : virtual ::ccc::EE3x6 {
  virtual void  pqr(); // _ZN3ccc8FF3x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x6y113efgEv
  ~FF3x6y11(); // tgen
  FF3x6y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x6y113pqrEv");}
void  ccc::FF3x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x6y113efgEv");}
ccc::FF3x6y11 ::~FF3x6y11(){ note_dtor("_ZN3ccc8FF3x6y11E", this);} // tgen
ccc::FF3x6y11 ::FF3x6y11(){ note_ctor("_ZN3ccc8FF3x6y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y11E, buf);
    ::ccc::FF3x6y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y11E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y11E);
    dp->::ccc::FF3x6y11::~FF3x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y11E(Test__ZN3ccc8FF3x6y11E, "_ZN3ccc8FF3x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y11C1Ev();
extern void _ZN3ccc8FF3x6y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y11E[] = {
  NSPAIR(_ZN3ccc8FF3x6y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y11E[];
extern void _ZN3ccc8FF3x6y113efgEv();
extern void _ZN3ccc8FF3x6y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y11E[] = {
  {&(_ZTVN3ccc8FF3x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y11E[];
static VTBL_ENTRY alt_thunk_names828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y11E = {  "_ZN3ccc8FF3x6y11E", // class name
  bases__ZN3ccc8FF3x6y11E, 2,
  &(vtc__ZN3ccc8FF3x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names828,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y12  : virtual ::ccc::EE3x6 {
  virtual void  abc(); // _ZN3ccc8FF3x6y123abcEv
  ~FF3x6y12(); // tgen
  FF3x6y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x6y123abcEv");}
ccc::FF3x6y12 ::~FF3x6y12(){ note_dtor("_ZN3ccc8FF3x6y12E", this);} // tgen
ccc::FF3x6y12 ::FF3x6y12(){ note_ctor("_ZN3ccc8FF3x6y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y12E, buf);
    ::ccc::FF3x6y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y12E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y12E);
    dp->::ccc::FF3x6y12::~FF3x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y12E(Test__ZN3ccc8FF3x6y12E, "_ZN3ccc8FF3x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y12C1Ev();
extern void _ZN3ccc8FF3x6y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y12E[] = {
  NSPAIR(_ZN3ccc8FF3x6y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x6y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y12E[] = {
  {&(_ZTVN3ccc8FF3x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y12E[];
static VTBL_ENTRY alt_thunk_names829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y12E = {  "_ZN3ccc8FF3x6y12E", // class name
  bases__ZN3ccc8FF3x6y12E, 2,
  &(vtc__ZN3ccc8FF3x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names829,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y13  : virtual ::ccc::EE3x6 {
  virtual void  efg(); // _ZN3ccc8FF3x6y133efgEv
  ~FF3x6y13(); // tgen
  FF3x6y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x6y133efgEv");}
ccc::FF3x6y13 ::~FF3x6y13(){ note_dtor("_ZN3ccc8FF3x6y13E", this);} // tgen
ccc::FF3x6y13 ::FF3x6y13(){ note_ctor("_ZN3ccc8FF3x6y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y13E, buf);
    ::ccc::FF3x6y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y13E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y13E);
    dp->::ccc::FF3x6y13::~FF3x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y13E(Test__ZN3ccc8FF3x6y13E, "_ZN3ccc8FF3x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y13C1Ev();
extern void _ZN3ccc8FF3x6y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y13E[] = {
  NSPAIR(_ZN3ccc8FF3x6y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y13E[];
extern void _ZN3ccc8FF3x6y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y13E[] = {
  {&(_ZTVN3ccc8FF3x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y13E[];
static VTBL_ENTRY alt_thunk_names830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y13E = {  "_ZN3ccc8FF3x6y13E", // class name
  bases__ZN3ccc8FF3x6y13E, 2,
  &(vtc__ZN3ccc8FF3x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names830,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y14  : virtual ::ccc::EE3x6 {
  virtual void  pqr(); // _ZN3ccc8FF3x6y143pqrEv
  ~FF3x6y14(); // tgen
  FF3x6y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x6y143pqrEv");}
ccc::FF3x6y14 ::~FF3x6y14(){ note_dtor("_ZN3ccc8FF3x6y14E", this);} // tgen
ccc::FF3x6y14 ::FF3x6y14(){ note_ctor("_ZN3ccc8FF3x6y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y14E, buf);
    ::ccc::FF3x6y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y14E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y14E);
    dp->::ccc::FF3x6y14::~FF3x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y14E(Test__ZN3ccc8FF3x6y14E, "_ZN3ccc8FF3x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y14C1Ev();
extern void _ZN3ccc8FF3x6y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y14E[] = {
  NSPAIR(_ZN3ccc8FF3x6y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x6y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x6y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y14E[] = {
  {&(_ZTVN3ccc8FF3x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y14E[];
static VTBL_ENTRY alt_thunk_names831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y14E = {  "_ZN3ccc8FF3x6y14E", // class name
  bases__ZN3ccc8FF3x6y14E, 2,
  &(vtc__ZN3ccc8FF3x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names831,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x6y15  : virtual ::ccc::EE3x6 {
  ~FF3x6y15(); // tgen
  FF3x6y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x6y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2}}
}
namespace ccc { 
ccc::FF3x6y15 ::~FF3x6y15(){ note_dtor("_ZN3ccc8FF3x6y15E", this);} // tgen
ccc::FF3x6y15 ::FF3x6y15(){ note_ctor("_ZN3ccc8FF3x6y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x6y15E, buf);
    ::ccc::FF3x6y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x6y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y15E");
    check_base_class_offset(lv, (::ccc::EE3x6*), 0, "_ZN3ccc8FF3x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x6y15E);
    dp->::ccc::FF3x6y15::~FF3x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x6y15E(Test__ZN3ccc8FF3x6y15E, "_ZN3ccc8FF3x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x6y15C1Ev();
extern void _ZN3ccc8FF3x6y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x6y15E[] = {
  NSPAIR(_ZN3ccc8FF3x6y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x6E[];
static Base_Class bases__ZN3ccc8FF3x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x6y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x6y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv)();
extern void _ZN3ccc5EE3x63efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv)();
extern void _ZN3ccc5EE3x63abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x6y15E[] = {
  {&(_ZTVN3ccc8FF3x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x6y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x6E__NS_8FF3x6y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x6y15E[];
static VTBL_ENTRY alt_thunk_names832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x63abcEv,_ZTv0_n20_N3ccc5EE3x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x63efgEv,_ZTv0_n12_N3ccc5EE3x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x6y15E = {  "_ZN3ccc8FF3x6y15E", // class name
  bases__ZN3ccc8FF3x6y15E, 2,
  &(vtc__ZN3ccc8FF3x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x6y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x6y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x6y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x6y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names832,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y0  : virtual ::ccc::EE3x7 {
  virtual void  abc(); // _ZN3ccc7FF3x7y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y03pqrEv
  ~FF3x7y0(); // tgen
  FF3x7y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y03abcEv");}
void  ccc::FF3x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y03efgEv");}
void  ccc::FF3x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y03pqrEv");}
ccc::FF3x7y0 ::~FF3x7y0(){ note_dtor("_ZN3ccc7FF3x7y0E", this);} // tgen
ccc::FF3x7y0 ::FF3x7y0(){ note_ctor("_ZN3ccc7FF3x7y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y0E, buf);
    ::ccc::FF3x7y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y0E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y0E);
    dp->::ccc::FF3x7y0::~FF3x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y0E(Test__ZN3ccc7FF3x7y0E, "_ZN3ccc7FF3x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y0C1Ev();
extern void _ZN3ccc7FF3x7y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y0E[] = {
  NSPAIR(_ZN3ccc7FF3x7y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y0E[];
extern void _ZN3ccc7FF3x7y03efgEv();
extern void _ZN3ccc7FF3x7y03pqrEv();
extern void _ZN3ccc7FF3x7y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y0E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y0E[] = {
  {&(_ZTVN3ccc7FF3x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y0E[];
static VTBL_ENTRY alt_thunk_names833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y0E = {  "_ZN3ccc7FF3x7y0E", // class name
  bases__ZN3ccc7FF3x7y0E, 2,
  &(vtc__ZN3ccc7FF3x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names833,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y1  : virtual ::ccc::EE3x7 {
  virtual void  abc(); // _ZN3ccc7FF3x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x7y13efgEv
  ~FF3x7y1(); // tgen
  FF3x7y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y13abcEv");}
void  ccc::FF3x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y13pqrEv");}
void  ccc::FF3x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y13efgEv");}
ccc::FF3x7y1 ::~FF3x7y1(){ note_dtor("_ZN3ccc7FF3x7y1E", this);} // tgen
ccc::FF3x7y1 ::FF3x7y1(){ note_ctor("_ZN3ccc7FF3x7y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y1E, buf);
    ::ccc::FF3x7y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y1E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y1E);
    dp->::ccc::FF3x7y1::~FF3x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y1E(Test__ZN3ccc7FF3x7y1E, "_ZN3ccc7FF3x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y1C1Ev();
extern void _ZN3ccc7FF3x7y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y1E[] = {
  NSPAIR(_ZN3ccc7FF3x7y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y1E[];
extern void _ZN3ccc7FF3x7y13efgEv();
extern void _ZN3ccc7FF3x7y13pqrEv();
extern void _ZN3ccc7FF3x7y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y1E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y1E[] = {
  {&(_ZTVN3ccc7FF3x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y1E[];
static VTBL_ENTRY alt_thunk_names834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y1E = {  "_ZN3ccc7FF3x7y1E", // class name
  bases__ZN3ccc7FF3x7y1E, 2,
  &(vtc__ZN3ccc7FF3x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names834,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y2  : virtual ::ccc::EE3x7 {
  virtual void  efg(); // _ZN3ccc7FF3x7y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y23pqrEv
  ~FF3x7y2(); // tgen
  FF3x7y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y23efgEv");}
void  ccc::FF3x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y23abcEv");}
void  ccc::FF3x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y23pqrEv");}
ccc::FF3x7y2 ::~FF3x7y2(){ note_dtor("_ZN3ccc7FF3x7y2E", this);} // tgen
ccc::FF3x7y2 ::FF3x7y2(){ note_ctor("_ZN3ccc7FF3x7y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y2E, buf);
    ::ccc::FF3x7y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y2E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y2E);
    dp->::ccc::FF3x7y2::~FF3x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y2E(Test__ZN3ccc7FF3x7y2E, "_ZN3ccc7FF3x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y2C1Ev();
extern void _ZN3ccc7FF3x7y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y2E[] = {
  NSPAIR(_ZN3ccc7FF3x7y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y2E[];
extern void _ZN3ccc7FF3x7y23efgEv();
extern void _ZN3ccc7FF3x7y23pqrEv();
extern void _ZN3ccc7FF3x7y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y2E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y2E[] = {
  {&(_ZTVN3ccc7FF3x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y2E[];
static VTBL_ENTRY alt_thunk_names835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y2E = {  "_ZN3ccc7FF3x7y2E", // class name
  bases__ZN3ccc7FF3x7y2E, 2,
  &(vtc__ZN3ccc7FF3x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names835,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y3  : virtual ::ccc::EE3x7 {
  virtual void  efg(); // _ZN3ccc7FF3x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x7y33abcEv
  ~FF3x7y3(); // tgen
  FF3x7y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y33efgEv");}
void  ccc::FF3x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y33pqrEv");}
void  ccc::FF3x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y33abcEv");}
ccc::FF3x7y3 ::~FF3x7y3(){ note_dtor("_ZN3ccc7FF3x7y3E", this);} // tgen
ccc::FF3x7y3 ::FF3x7y3(){ note_ctor("_ZN3ccc7FF3x7y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y3E, buf);
    ::ccc::FF3x7y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y3E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y3E);
    dp->::ccc::FF3x7y3::~FF3x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y3E(Test__ZN3ccc7FF3x7y3E, "_ZN3ccc7FF3x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y3C1Ev();
extern void _ZN3ccc7FF3x7y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y3E[] = {
  NSPAIR(_ZN3ccc7FF3x7y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y3E[];
extern void _ZN3ccc7FF3x7y33efgEv();
extern void _ZN3ccc7FF3x7y33pqrEv();
extern void _ZN3ccc7FF3x7y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y3E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y3E[] = {
  {&(_ZTVN3ccc7FF3x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y3E[];
static VTBL_ENTRY alt_thunk_names836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y3E = {  "_ZN3ccc7FF3x7y3E", // class name
  bases__ZN3ccc7FF3x7y3E, 2,
  &(vtc__ZN3ccc7FF3x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names836,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y4  : virtual ::ccc::EE3x7 {
  virtual void  pqr(); // _ZN3ccc7FF3x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x7y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x7y43efgEv
  ~FF3x7y4(); // tgen
  FF3x7y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y43pqrEv");}
void  ccc::FF3x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y43abcEv");}
void  ccc::FF3x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y43efgEv");}
ccc::FF3x7y4 ::~FF3x7y4(){ note_dtor("_ZN3ccc7FF3x7y4E", this);} // tgen
ccc::FF3x7y4 ::FF3x7y4(){ note_ctor("_ZN3ccc7FF3x7y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y4E, buf);
    ::ccc::FF3x7y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y4E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y4E);
    dp->::ccc::FF3x7y4::~FF3x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y4E(Test__ZN3ccc7FF3x7y4E, "_ZN3ccc7FF3x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y4C1Ev();
extern void _ZN3ccc7FF3x7y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y4E[] = {
  NSPAIR(_ZN3ccc7FF3x7y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y4E[];
extern void _ZN3ccc7FF3x7y43efgEv();
extern void _ZN3ccc7FF3x7y43pqrEv();
extern void _ZN3ccc7FF3x7y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y4E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y4E[] = {
  {&(_ZTVN3ccc7FF3x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y4E[];
static VTBL_ENTRY alt_thunk_names837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y4E = {  "_ZN3ccc7FF3x7y4E", // class name
  bases__ZN3ccc7FF3x7y4E, 2,
  &(vtc__ZN3ccc7FF3x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names837,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y5  : virtual ::ccc::EE3x7 {
  virtual void  pqr(); // _ZN3ccc7FF3x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x7y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x7y53abcEv
  ~FF3x7y5(); // tgen
  FF3x7y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y53pqrEv");}
void  ccc::FF3x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y53efgEv");}
void  ccc::FF3x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y53abcEv");}
ccc::FF3x7y5 ::~FF3x7y5(){ note_dtor("_ZN3ccc7FF3x7y5E", this);} // tgen
ccc::FF3x7y5 ::FF3x7y5(){ note_ctor("_ZN3ccc7FF3x7y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y5E, buf);
    ::ccc::FF3x7y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y5E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y5E);
    dp->::ccc::FF3x7y5::~FF3x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y5E(Test__ZN3ccc7FF3x7y5E, "_ZN3ccc7FF3x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y5C1Ev();
extern void _ZN3ccc7FF3x7y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y5E[] = {
  NSPAIR(_ZN3ccc7FF3x7y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y5E[];
extern void _ZN3ccc7FF3x7y53efgEv();
extern void _ZN3ccc7FF3x7y53pqrEv();
extern void _ZN3ccc7FF3x7y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y5E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y5E[] = {
  {&(_ZTVN3ccc7FF3x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y5E[];
static VTBL_ENTRY alt_thunk_names838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y5E = {  "_ZN3ccc7FF3x7y5E", // class name
  bases__ZN3ccc7FF3x7y5E, 2,
  &(vtc__ZN3ccc7FF3x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names838,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y6  : virtual ::ccc::EE3x7 {
  virtual void  abc(); // _ZN3ccc7FF3x7y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x7y63efgEv
  ~FF3x7y6(); // tgen
  FF3x7y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y63abcEv");}
void  ccc::FF3x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y63efgEv");}
ccc::FF3x7y6 ::~FF3x7y6(){ note_dtor("_ZN3ccc7FF3x7y6E", this);} // tgen
ccc::FF3x7y6 ::FF3x7y6(){ note_ctor("_ZN3ccc7FF3x7y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y6E, buf);
    ::ccc::FF3x7y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y6E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y6E);
    dp->::ccc::FF3x7y6::~FF3x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y6E(Test__ZN3ccc7FF3x7y6E, "_ZN3ccc7FF3x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y6C1Ev();
extern void _ZN3ccc7FF3x7y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y6E[] = {
  NSPAIR(_ZN3ccc7FF3x7y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y6E[];
extern void _ZN3ccc7FF3x7y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x7y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y6E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y6E[] = {
  {&(_ZTVN3ccc7FF3x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y6E[];
static VTBL_ENTRY alt_thunk_names839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y6E = {  "_ZN3ccc7FF3x7y6E", // class name
  bases__ZN3ccc7FF3x7y6E, 2,
  &(vtc__ZN3ccc7FF3x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names839,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y7  : virtual ::ccc::EE3x7 {
  virtual void  abc(); // _ZN3ccc7FF3x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y73pqrEv
  ~FF3x7y7(); // tgen
  FF3x7y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y73abcEv");}
void  ccc::FF3x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y73pqrEv");}
ccc::FF3x7y7 ::~FF3x7y7(){ note_dtor("_ZN3ccc7FF3x7y7E", this);} // tgen
ccc::FF3x7y7 ::FF3x7y7(){ note_ctor("_ZN3ccc7FF3x7y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y7E, buf);
    ::ccc::FF3x7y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y7E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y7E);
    dp->::ccc::FF3x7y7::~FF3x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y7E(Test__ZN3ccc7FF3x7y7E, "_ZN3ccc7FF3x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y7C1Ev();
extern void _ZN3ccc7FF3x7y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y7E[] = {
  NSPAIR(_ZN3ccc7FF3x7y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7FF3x7y73pqrEv();
extern void _ZN3ccc7FF3x7y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y7E[] = {
  {&(_ZTVN3ccc7FF3x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y7E[];
static VTBL_ENTRY alt_thunk_names840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y7E = {  "_ZN3ccc7FF3x7y7E", // class name
  bases__ZN3ccc7FF3x7y7E, 2,
  &(vtc__ZN3ccc7FF3x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names840,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y8  : virtual ::ccc::EE3x7 {
  virtual void  efg(); // _ZN3ccc7FF3x7y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x7y83abcEv
  ~FF3x7y8(); // tgen
  FF3x7y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y83efgEv");}
void  ccc::FF3x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x7y83abcEv");}
ccc::FF3x7y8 ::~FF3x7y8(){ note_dtor("_ZN3ccc7FF3x7y8E", this);} // tgen
ccc::FF3x7y8 ::FF3x7y8(){ note_ctor("_ZN3ccc7FF3x7y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y8E, buf);
    ::ccc::FF3x7y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y8E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y8E);
    dp->::ccc::FF3x7y8::~FF3x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y8E(Test__ZN3ccc7FF3x7y8E, "_ZN3ccc7FF3x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y8C1Ev();
extern void _ZN3ccc7FF3x7y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y8E[] = {
  NSPAIR(_ZN3ccc7FF3x7y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y8E[];
extern void _ZN3ccc7FF3x7y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x7y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y8E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y8E[] = {
  {&(_ZTVN3ccc7FF3x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y8E[];
static VTBL_ENTRY alt_thunk_names841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y8E = {  "_ZN3ccc7FF3x7y8E", // class name
  bases__ZN3ccc7FF3x7y8E, 2,
  &(vtc__ZN3ccc7FF3x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names841,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y9  : virtual ::ccc::EE3x7 {
  virtual void  efg(); // _ZN3ccc7FF3x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x7y93pqrEv
  ~FF3x7y9(); // tgen
  FF3x7y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x7y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x7y93efgEv");}
void  ccc::FF3x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x7y93pqrEv");}
ccc::FF3x7y9 ::~FF3x7y9(){ note_dtor("_ZN3ccc7FF3x7y9E", this);} // tgen
ccc::FF3x7y9 ::FF3x7y9(){ note_ctor("_ZN3ccc7FF3x7y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x7y9E, buf);
    ::ccc::FF3x7y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x7y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y9E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc7FF3x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x7y9E);
    dp->::ccc::FF3x7y9::~FF3x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x7y9E(Test__ZN3ccc7FF3x7y9E, "_ZN3ccc7FF3x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x7y9C1Ev();
extern void _ZN3ccc7FF3x7y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x7y9E[] = {
  NSPAIR(_ZN3ccc7FF3x7y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc7FF3x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y9E[];
extern void _ZN3ccc7FF3x7y93efgEv();
extern void _ZN3ccc7FF3x7y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x7y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x7y9E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x7y9E[] = {
  {&(_ZTVN3ccc7FF3x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x7y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_7FF3x7y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x7y9E[];
static VTBL_ENTRY alt_thunk_names842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x7y9E = {  "_ZN3ccc7FF3x7y9E", // class name
  bases__ZN3ccc7FF3x7y9E, 2,
  &(vtc__ZN3ccc7FF3x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x7y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x7y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x7y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x7y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names842,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y10  : virtual ::ccc::EE3x7 {
  virtual void  pqr(); // _ZN3ccc8FF3x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x7y103abcEv
  ~FF3x7y10(); // tgen
  FF3x7y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x7y103pqrEv");}
void  ccc::FF3x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x7y103abcEv");}
ccc::FF3x7y10 ::~FF3x7y10(){ note_dtor("_ZN3ccc8FF3x7y10E", this);} // tgen
ccc::FF3x7y10 ::FF3x7y10(){ note_ctor("_ZN3ccc8FF3x7y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y10E, buf);
    ::ccc::FF3x7y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y10E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y10E);
    dp->::ccc::FF3x7y10::~FF3x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y10E(Test__ZN3ccc8FF3x7y10E, "_ZN3ccc8FF3x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y10C1Ev();
extern void _ZN3ccc8FF3x7y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y10E[] = {
  NSPAIR(_ZN3ccc8FF3x7y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x7y103pqrEv();
extern void _ZN3ccc8FF3x7y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y10E[] = {
  {&(_ZTVN3ccc8FF3x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y10E[];
static VTBL_ENTRY alt_thunk_names843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y10E = {  "_ZN3ccc8FF3x7y10E", // class name
  bases__ZN3ccc8FF3x7y10E, 2,
  &(vtc__ZN3ccc8FF3x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names843,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y11  : virtual ::ccc::EE3x7 {
  virtual void  pqr(); // _ZN3ccc8FF3x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x7y113efgEv
  ~FF3x7y11(); // tgen
  FF3x7y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x7y113pqrEv");}
void  ccc::FF3x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x7y113efgEv");}
ccc::FF3x7y11 ::~FF3x7y11(){ note_dtor("_ZN3ccc8FF3x7y11E", this);} // tgen
ccc::FF3x7y11 ::FF3x7y11(){ note_ctor("_ZN3ccc8FF3x7y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y11E, buf);
    ::ccc::FF3x7y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y11E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y11E);
    dp->::ccc::FF3x7y11::~FF3x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y11E(Test__ZN3ccc8FF3x7y11E, "_ZN3ccc8FF3x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y11C1Ev();
extern void _ZN3ccc8FF3x7y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y11E[] = {
  NSPAIR(_ZN3ccc8FF3x7y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y11E[];
extern void _ZN3ccc8FF3x7y113efgEv();
extern void _ZN3ccc8FF3x7y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y11E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y11E[] = {
  {&(_ZTVN3ccc8FF3x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y11E[];
static VTBL_ENTRY alt_thunk_names844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y11E = {  "_ZN3ccc8FF3x7y11E", // class name
  bases__ZN3ccc8FF3x7y11E, 2,
  &(vtc__ZN3ccc8FF3x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names844,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y12  : virtual ::ccc::EE3x7 {
  virtual void  abc(); // _ZN3ccc8FF3x7y123abcEv
  ~FF3x7y12(); // tgen
  FF3x7y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x7y123abcEv");}
ccc::FF3x7y12 ::~FF3x7y12(){ note_dtor("_ZN3ccc8FF3x7y12E", this);} // tgen
ccc::FF3x7y12 ::FF3x7y12(){ note_ctor("_ZN3ccc8FF3x7y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y12E, buf);
    ::ccc::FF3x7y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y12E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y12E);
    dp->::ccc::FF3x7y12::~FF3x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y12E(Test__ZN3ccc8FF3x7y12E, "_ZN3ccc8FF3x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y12C1Ev();
extern void _ZN3ccc8FF3x7y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y12E[] = {
  NSPAIR(_ZN3ccc8FF3x7y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x7y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y12E[] = {
  {&(_ZTVN3ccc8FF3x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y12E[];
static VTBL_ENTRY alt_thunk_names845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y12E = {  "_ZN3ccc8FF3x7y12E", // class name
  bases__ZN3ccc8FF3x7y12E, 2,
  &(vtc__ZN3ccc8FF3x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names845,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y13  : virtual ::ccc::EE3x7 {
  virtual void  efg(); // _ZN3ccc8FF3x7y133efgEv
  ~FF3x7y13(); // tgen
  FF3x7y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x7y133efgEv");}
ccc::FF3x7y13 ::~FF3x7y13(){ note_dtor("_ZN3ccc8FF3x7y13E", this);} // tgen
ccc::FF3x7y13 ::FF3x7y13(){ note_ctor("_ZN3ccc8FF3x7y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y13E, buf);
    ::ccc::FF3x7y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y13E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y13E);
    dp->::ccc::FF3x7y13::~FF3x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y13E(Test__ZN3ccc8FF3x7y13E, "_ZN3ccc8FF3x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y13C1Ev();
extern void _ZN3ccc8FF3x7y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y13E[] = {
  NSPAIR(_ZN3ccc8FF3x7y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y13E[];
extern void _ZN3ccc8FF3x7y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y13E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y13E[] = {
  {&(_ZTVN3ccc8FF3x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y13E[];
static VTBL_ENTRY alt_thunk_names846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y13E = {  "_ZN3ccc8FF3x7y13E", // class name
  bases__ZN3ccc8FF3x7y13E, 2,
  &(vtc__ZN3ccc8FF3x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names846,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y14  : virtual ::ccc::EE3x7 {
  virtual void  pqr(); // _ZN3ccc8FF3x7y143pqrEv
  ~FF3x7y14(); // tgen
  FF3x7y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x7y143pqrEv");}
ccc::FF3x7y14 ::~FF3x7y14(){ note_dtor("_ZN3ccc8FF3x7y14E", this);} // tgen
ccc::FF3x7y14 ::FF3x7y14(){ note_ctor("_ZN3ccc8FF3x7y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y14E, buf);
    ::ccc::FF3x7y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y14E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y14E);
    dp->::ccc::FF3x7y14::~FF3x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y14E(Test__ZN3ccc8FF3x7y14E, "_ZN3ccc8FF3x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y14C1Ev();
extern void _ZN3ccc8FF3x7y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y14E[] = {
  NSPAIR(_ZN3ccc8FF3x7y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x7y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x7y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y14E[] = {
  {&(_ZTVN3ccc8FF3x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y14E[];
static VTBL_ENTRY alt_thunk_names847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y14E = {  "_ZN3ccc8FF3x7y14E", // class name
  bases__ZN3ccc8FF3x7y14E, 2,
  &(vtc__ZN3ccc8FF3x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names847,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x7y15  : virtual ::ccc::EE3x7 {
  ~FF3x7y15(); // tgen
  FF3x7y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x7y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2}}
}
namespace ccc { 
ccc::FF3x7y15 ::~FF3x7y15(){ note_dtor("_ZN3ccc8FF3x7y15E", this);} // tgen
ccc::FF3x7y15 ::FF3x7y15(){ note_ctor("_ZN3ccc8FF3x7y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x7y15E, buf);
    ::ccc::FF3x7y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x7y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y15E");
    check_base_class_offset(lv, (::ccc::EE3x7*), 0, "_ZN3ccc8FF3x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x7y15E);
    dp->::ccc::FF3x7y15::~FF3x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x7y15E(Test__ZN3ccc8FF3x7y15E, "_ZN3ccc8FF3x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x7y15C1Ev();
extern void _ZN3ccc8FF3x7y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x7y15E[] = {
  NSPAIR(_ZN3ccc8FF3x7y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x7E[];
static Base_Class bases__ZN3ccc8FF3x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x7y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv)();
extern void _ZN3ccc5EE3x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv)();
extern void _ZN3ccc5EE3x73abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x7y15E[] = {
  {&(_ZTVN3ccc8FF3x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x7y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x7E__NS_8FF3x7y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x7y15E[];
static VTBL_ENTRY alt_thunk_names848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x73abcEv,_ZTv0_n20_N3ccc5EE3x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x73pqrEv,_ZTv0_n16_N3ccc5EE3x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x7y15E = {  "_ZN3ccc8FF3x7y15E", // class name
  bases__ZN3ccc8FF3x7y15E, 2,
  &(vtc__ZN3ccc8FF3x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x7y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x7y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x7y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x7y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names848,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y0  : virtual ::ccc::EE3x8 {
  virtual void  abc(); // _ZN3ccc7FF3x8y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y03pqrEv
  ~FF3x8y0(); // tgen
  FF3x8y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y03abcEv");}
void  ccc::FF3x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y03efgEv");}
void  ccc::FF3x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y03pqrEv");}
ccc::FF3x8y0 ::~FF3x8y0(){ note_dtor("_ZN3ccc7FF3x8y0E", this);} // tgen
ccc::FF3x8y0 ::FF3x8y0(){ note_ctor("_ZN3ccc7FF3x8y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y0E, buf);
    ::ccc::FF3x8y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y0E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y0E);
    dp->::ccc::FF3x8y0::~FF3x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y0E(Test__ZN3ccc7FF3x8y0E, "_ZN3ccc7FF3x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y0C1Ev();
extern void _ZN3ccc7FF3x8y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y0E[] = {
  NSPAIR(_ZN3ccc7FF3x8y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y0E[];
extern void _ZN3ccc7FF3x8y03efgEv();
extern void _ZN3ccc7FF3x8y03pqrEv();
extern void _ZN3ccc7FF3x8y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y0E[] = {
  {&(_ZTVN3ccc7FF3x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y0E[];
static VTBL_ENTRY alt_thunk_names849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y0E = {  "_ZN3ccc7FF3x8y0E", // class name
  bases__ZN3ccc7FF3x8y0E, 2,
  &(vtc__ZN3ccc7FF3x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names849,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y1  : virtual ::ccc::EE3x8 {
  virtual void  abc(); // _ZN3ccc7FF3x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x8y13efgEv
  ~FF3x8y1(); // tgen
  FF3x8y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y13abcEv");}
void  ccc::FF3x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y13pqrEv");}
void  ccc::FF3x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y13efgEv");}
ccc::FF3x8y1 ::~FF3x8y1(){ note_dtor("_ZN3ccc7FF3x8y1E", this);} // tgen
ccc::FF3x8y1 ::FF3x8y1(){ note_ctor("_ZN3ccc7FF3x8y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y1E, buf);
    ::ccc::FF3x8y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y1E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y1E);
    dp->::ccc::FF3x8y1::~FF3x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y1E(Test__ZN3ccc7FF3x8y1E, "_ZN3ccc7FF3x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y1C1Ev();
extern void _ZN3ccc7FF3x8y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y1E[] = {
  NSPAIR(_ZN3ccc7FF3x8y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y1E[];
extern void _ZN3ccc7FF3x8y13efgEv();
extern void _ZN3ccc7FF3x8y13pqrEv();
extern void _ZN3ccc7FF3x8y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y1E[] = {
  {&(_ZTVN3ccc7FF3x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y1E[];
static VTBL_ENTRY alt_thunk_names850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y1E = {  "_ZN3ccc7FF3x8y1E", // class name
  bases__ZN3ccc7FF3x8y1E, 2,
  &(vtc__ZN3ccc7FF3x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names850,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y2  : virtual ::ccc::EE3x8 {
  virtual void  efg(); // _ZN3ccc7FF3x8y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y23pqrEv
  ~FF3x8y2(); // tgen
  FF3x8y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y23efgEv");}
void  ccc::FF3x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y23abcEv");}
void  ccc::FF3x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y23pqrEv");}
ccc::FF3x8y2 ::~FF3x8y2(){ note_dtor("_ZN3ccc7FF3x8y2E", this);} // tgen
ccc::FF3x8y2 ::FF3x8y2(){ note_ctor("_ZN3ccc7FF3x8y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y2E, buf);
    ::ccc::FF3x8y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y2E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y2E);
    dp->::ccc::FF3x8y2::~FF3x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y2E(Test__ZN3ccc7FF3x8y2E, "_ZN3ccc7FF3x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y2C1Ev();
extern void _ZN3ccc7FF3x8y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y2E[] = {
  NSPAIR(_ZN3ccc7FF3x8y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y2E[];
extern void _ZN3ccc7FF3x8y23efgEv();
extern void _ZN3ccc7FF3x8y23pqrEv();
extern void _ZN3ccc7FF3x8y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y2E[] = {
  {&(_ZTVN3ccc7FF3x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y2E[];
static VTBL_ENTRY alt_thunk_names851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y2E = {  "_ZN3ccc7FF3x8y2E", // class name
  bases__ZN3ccc7FF3x8y2E, 2,
  &(vtc__ZN3ccc7FF3x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names851,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y3  : virtual ::ccc::EE3x8 {
  virtual void  efg(); // _ZN3ccc7FF3x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x8y33abcEv
  ~FF3x8y3(); // tgen
  FF3x8y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y33efgEv");}
void  ccc::FF3x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y33pqrEv");}
void  ccc::FF3x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y33abcEv");}
ccc::FF3x8y3 ::~FF3x8y3(){ note_dtor("_ZN3ccc7FF3x8y3E", this);} // tgen
ccc::FF3x8y3 ::FF3x8y3(){ note_ctor("_ZN3ccc7FF3x8y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y3E, buf);
    ::ccc::FF3x8y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y3E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y3E);
    dp->::ccc::FF3x8y3::~FF3x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y3E(Test__ZN3ccc7FF3x8y3E, "_ZN3ccc7FF3x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y3C1Ev();
extern void _ZN3ccc7FF3x8y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y3E[] = {
  NSPAIR(_ZN3ccc7FF3x8y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y3E[];
extern void _ZN3ccc7FF3x8y33efgEv();
extern void _ZN3ccc7FF3x8y33pqrEv();
extern void _ZN3ccc7FF3x8y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y3E[] = {
  {&(_ZTVN3ccc7FF3x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y3E[];
static VTBL_ENTRY alt_thunk_names852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y3E = {  "_ZN3ccc7FF3x8y3E", // class name
  bases__ZN3ccc7FF3x8y3E, 2,
  &(vtc__ZN3ccc7FF3x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names852,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y4  : virtual ::ccc::EE3x8 {
  virtual void  pqr(); // _ZN3ccc7FF3x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x8y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x8y43efgEv
  ~FF3x8y4(); // tgen
  FF3x8y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y43pqrEv");}
void  ccc::FF3x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y43abcEv");}
void  ccc::FF3x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y43efgEv");}
ccc::FF3x8y4 ::~FF3x8y4(){ note_dtor("_ZN3ccc7FF3x8y4E", this);} // tgen
ccc::FF3x8y4 ::FF3x8y4(){ note_ctor("_ZN3ccc7FF3x8y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y4E, buf);
    ::ccc::FF3x8y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y4E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y4E);
    dp->::ccc::FF3x8y4::~FF3x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y4E(Test__ZN3ccc7FF3x8y4E, "_ZN3ccc7FF3x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y4C1Ev();
extern void _ZN3ccc7FF3x8y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y4E[] = {
  NSPAIR(_ZN3ccc7FF3x8y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y4E[];
extern void _ZN3ccc7FF3x8y43efgEv();
extern void _ZN3ccc7FF3x8y43pqrEv();
extern void _ZN3ccc7FF3x8y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y4E[] = {
  {&(_ZTVN3ccc7FF3x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y4E[];
static VTBL_ENTRY alt_thunk_names853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y4E = {  "_ZN3ccc7FF3x8y4E", // class name
  bases__ZN3ccc7FF3x8y4E, 2,
  &(vtc__ZN3ccc7FF3x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names853,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y5  : virtual ::ccc::EE3x8 {
  virtual void  pqr(); // _ZN3ccc7FF3x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x8y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x8y53abcEv
  ~FF3x8y5(); // tgen
  FF3x8y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y53pqrEv");}
void  ccc::FF3x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y53efgEv");}
void  ccc::FF3x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y53abcEv");}
ccc::FF3x8y5 ::~FF3x8y5(){ note_dtor("_ZN3ccc7FF3x8y5E", this);} // tgen
ccc::FF3x8y5 ::FF3x8y5(){ note_ctor("_ZN3ccc7FF3x8y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y5E, buf);
    ::ccc::FF3x8y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y5E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y5E);
    dp->::ccc::FF3x8y5::~FF3x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y5E(Test__ZN3ccc7FF3x8y5E, "_ZN3ccc7FF3x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y5C1Ev();
extern void _ZN3ccc7FF3x8y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y5E[] = {
  NSPAIR(_ZN3ccc7FF3x8y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y5E[];
extern void _ZN3ccc7FF3x8y53efgEv();
extern void _ZN3ccc7FF3x8y53pqrEv();
extern void _ZN3ccc7FF3x8y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y5E[] = {
  {&(_ZTVN3ccc7FF3x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y5E[];
static VTBL_ENTRY alt_thunk_names854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y5E = {  "_ZN3ccc7FF3x8y5E", // class name
  bases__ZN3ccc7FF3x8y5E, 2,
  &(vtc__ZN3ccc7FF3x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names854,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y6  : virtual ::ccc::EE3x8 {
  virtual void  abc(); // _ZN3ccc7FF3x8y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x8y63efgEv
  ~FF3x8y6(); // tgen
  FF3x8y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y63abcEv");}
void  ccc::FF3x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y63efgEv");}
ccc::FF3x8y6 ::~FF3x8y6(){ note_dtor("_ZN3ccc7FF3x8y6E", this);} // tgen
ccc::FF3x8y6 ::FF3x8y6(){ note_ctor("_ZN3ccc7FF3x8y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y6E, buf);
    ::ccc::FF3x8y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y6E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y6E);
    dp->::ccc::FF3x8y6::~FF3x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y6E(Test__ZN3ccc7FF3x8y6E, "_ZN3ccc7FF3x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y6C1Ev();
extern void _ZN3ccc7FF3x8y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y6E[] = {
  NSPAIR(_ZN3ccc7FF3x8y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y6E[];
extern void _ZN3ccc7FF3x8y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7FF3x8y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y6E[] = {
  {&(_ZTVN3ccc7FF3x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y6E[];
static VTBL_ENTRY alt_thunk_names855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y6E = {  "_ZN3ccc7FF3x8y6E", // class name
  bases__ZN3ccc7FF3x8y6E, 2,
  &(vtc__ZN3ccc7FF3x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names855,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y7  : virtual ::ccc::EE3x8 {
  virtual void  abc(); // _ZN3ccc7FF3x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y73pqrEv
  ~FF3x8y7(); // tgen
  FF3x8y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y73abcEv");}
void  ccc::FF3x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y73pqrEv");}
ccc::FF3x8y7 ::~FF3x8y7(){ note_dtor("_ZN3ccc7FF3x8y7E", this);} // tgen
ccc::FF3x8y7 ::FF3x8y7(){ note_ctor("_ZN3ccc7FF3x8y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y7E, buf);
    ::ccc::FF3x8y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y7E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y7E);
    dp->::ccc::FF3x8y7::~FF3x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y7E(Test__ZN3ccc7FF3x8y7E, "_ZN3ccc7FF3x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y7C1Ev();
extern void _ZN3ccc7FF3x8y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y7E[] = {
  NSPAIR(_ZN3ccc7FF3x8y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x8y73pqrEv();
extern void _ZN3ccc7FF3x8y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y7E[] = {
  {&(_ZTVN3ccc7FF3x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y7E[];
static VTBL_ENTRY alt_thunk_names856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y7E = {  "_ZN3ccc7FF3x8y7E", // class name
  bases__ZN3ccc7FF3x8y7E, 2,
  &(vtc__ZN3ccc7FF3x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names856,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y8  : virtual ::ccc::EE3x8 {
  virtual void  efg(); // _ZN3ccc7FF3x8y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x8y83abcEv
  ~FF3x8y8(); // tgen
  FF3x8y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y83efgEv");}
void  ccc::FF3x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x8y83abcEv");}
ccc::FF3x8y8 ::~FF3x8y8(){ note_dtor("_ZN3ccc7FF3x8y8E", this);} // tgen
ccc::FF3x8y8 ::FF3x8y8(){ note_ctor("_ZN3ccc7FF3x8y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y8E, buf);
    ::ccc::FF3x8y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y8E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y8E);
    dp->::ccc::FF3x8y8::~FF3x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y8E(Test__ZN3ccc7FF3x8y8E, "_ZN3ccc7FF3x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y8C1Ev();
extern void _ZN3ccc7FF3x8y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y8E[] = {
  NSPAIR(_ZN3ccc7FF3x8y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y8E[];
extern void _ZN3ccc7FF3x8y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7FF3x8y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y8E[] = {
  {&(_ZTVN3ccc7FF3x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y8E[];
static VTBL_ENTRY alt_thunk_names857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y8E = {  "_ZN3ccc7FF3x8y8E", // class name
  bases__ZN3ccc7FF3x8y8E, 2,
  &(vtc__ZN3ccc7FF3x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names857,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y9  : virtual ::ccc::EE3x8 {
  virtual void  efg(); // _ZN3ccc7FF3x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x8y93pqrEv
  ~FF3x8y9(); // tgen
  FF3x8y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x8y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x8y93efgEv");}
void  ccc::FF3x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x8y93pqrEv");}
ccc::FF3x8y9 ::~FF3x8y9(){ note_dtor("_ZN3ccc7FF3x8y9E", this);} // tgen
ccc::FF3x8y9 ::FF3x8y9(){ note_ctor("_ZN3ccc7FF3x8y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x8y9E, buf);
    ::ccc::FF3x8y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x8y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y9E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc7FF3x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x8y9E);
    dp->::ccc::FF3x8y9::~FF3x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x8y9E(Test__ZN3ccc7FF3x8y9E, "_ZN3ccc7FF3x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x8y9C1Ev();
extern void _ZN3ccc7FF3x8y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x8y9E[] = {
  NSPAIR(_ZN3ccc7FF3x8y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc7FF3x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y9E[];
extern void _ZN3ccc7FF3x8y93efgEv();
extern void _ZN3ccc7FF3x8y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF3x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x8y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x8y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x8y9E[] = {
  {&(_ZTVN3ccc7FF3x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x8y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_7FF3x8y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x8y9E[];
static VTBL_ENTRY alt_thunk_names858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x8y9E = {  "_ZN3ccc7FF3x8y9E", // class name
  bases__ZN3ccc7FF3x8y9E, 2,
  &(vtc__ZN3ccc7FF3x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x8y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x8y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x8y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x8y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names858,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y10  : virtual ::ccc::EE3x8 {
  virtual void  pqr(); // _ZN3ccc8FF3x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x8y103abcEv
  ~FF3x8y10(); // tgen
  FF3x8y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x8y103pqrEv");}
void  ccc::FF3x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x8y103abcEv");}
ccc::FF3x8y10 ::~FF3x8y10(){ note_dtor("_ZN3ccc8FF3x8y10E", this);} // tgen
ccc::FF3x8y10 ::FF3x8y10(){ note_ctor("_ZN3ccc8FF3x8y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y10E, buf);
    ::ccc::FF3x8y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y10E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y10E);
    dp->::ccc::FF3x8y10::~FF3x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y10E(Test__ZN3ccc8FF3x8y10E, "_ZN3ccc8FF3x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y10C1Ev();
extern void _ZN3ccc8FF3x8y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y10E[] = {
  NSPAIR(_ZN3ccc8FF3x8y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x8y103pqrEv();
extern void _ZN3ccc8FF3x8y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y10E[] = {
  {&(_ZTVN3ccc8FF3x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y10E[];
static VTBL_ENTRY alt_thunk_names859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y10E = {  "_ZN3ccc8FF3x8y10E", // class name
  bases__ZN3ccc8FF3x8y10E, 2,
  &(vtc__ZN3ccc8FF3x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names859,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y11  : virtual ::ccc::EE3x8 {
  virtual void  pqr(); // _ZN3ccc8FF3x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x8y113efgEv
  ~FF3x8y11(); // tgen
  FF3x8y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x8y113pqrEv");}
void  ccc::FF3x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x8y113efgEv");}
ccc::FF3x8y11 ::~FF3x8y11(){ note_dtor("_ZN3ccc8FF3x8y11E", this);} // tgen
ccc::FF3x8y11 ::FF3x8y11(){ note_ctor("_ZN3ccc8FF3x8y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y11E, buf);
    ::ccc::FF3x8y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y11E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y11E);
    dp->::ccc::FF3x8y11::~FF3x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y11E(Test__ZN3ccc8FF3x8y11E, "_ZN3ccc8FF3x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y11C1Ev();
extern void _ZN3ccc8FF3x8y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y11E[] = {
  NSPAIR(_ZN3ccc8FF3x8y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y11E[];
extern void _ZN3ccc8FF3x8y113efgEv();
extern void _ZN3ccc8FF3x8y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y11E[] = {
  {&(_ZTVN3ccc8FF3x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y11E[];
static VTBL_ENTRY alt_thunk_names860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y11E = {  "_ZN3ccc8FF3x8y11E", // class name
  bases__ZN3ccc8FF3x8y11E, 2,
  &(vtc__ZN3ccc8FF3x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names860,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y12  : virtual ::ccc::EE3x8 {
  virtual void  abc(); // _ZN3ccc8FF3x8y123abcEv
  ~FF3x8y12(); // tgen
  FF3x8y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x8y123abcEv");}
ccc::FF3x8y12 ::~FF3x8y12(){ note_dtor("_ZN3ccc8FF3x8y12E", this);} // tgen
ccc::FF3x8y12 ::FF3x8y12(){ note_ctor("_ZN3ccc8FF3x8y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y12E, buf);
    ::ccc::FF3x8y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y12E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y12E);
    dp->::ccc::FF3x8y12::~FF3x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y12E(Test__ZN3ccc8FF3x8y12E, "_ZN3ccc8FF3x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y12C1Ev();
extern void _ZN3ccc8FF3x8y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y12E[] = {
  NSPAIR(_ZN3ccc8FF3x8y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x8y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y12E[] = {
  {&(_ZTVN3ccc8FF3x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y12E[];
static VTBL_ENTRY alt_thunk_names861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y12E = {  "_ZN3ccc8FF3x8y12E", // class name
  bases__ZN3ccc8FF3x8y12E, 2,
  &(vtc__ZN3ccc8FF3x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names861,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y13  : virtual ::ccc::EE3x8 {
  virtual void  efg(); // _ZN3ccc8FF3x8y133efgEv
  ~FF3x8y13(); // tgen
  FF3x8y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x8y133efgEv");}
ccc::FF3x8y13 ::~FF3x8y13(){ note_dtor("_ZN3ccc8FF3x8y13E", this);} // tgen
ccc::FF3x8y13 ::FF3x8y13(){ note_ctor("_ZN3ccc8FF3x8y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y13E, buf);
    ::ccc::FF3x8y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y13E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y13E);
    dp->::ccc::FF3x8y13::~FF3x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y13E(Test__ZN3ccc8FF3x8y13E, "_ZN3ccc8FF3x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y13C1Ev();
extern void _ZN3ccc8FF3x8y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y13E[] = {
  NSPAIR(_ZN3ccc8FF3x8y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y13E[];
extern void _ZN3ccc8FF3x8y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y13E[] = {
  {&(_ZTVN3ccc8FF3x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y13E[];
static VTBL_ENTRY alt_thunk_names862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y13E = {  "_ZN3ccc8FF3x8y13E", // class name
  bases__ZN3ccc8FF3x8y13E, 2,
  &(vtc__ZN3ccc8FF3x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names862,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y14  : virtual ::ccc::EE3x8 {
  virtual void  pqr(); // _ZN3ccc8FF3x8y143pqrEv
  ~FF3x8y14(); // tgen
  FF3x8y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x8y143pqrEv");}
ccc::FF3x8y14 ::~FF3x8y14(){ note_dtor("_ZN3ccc8FF3x8y14E", this);} // tgen
ccc::FF3x8y14 ::FF3x8y14(){ note_ctor("_ZN3ccc8FF3x8y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y14E, buf);
    ::ccc::FF3x8y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y14E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y14E);
    dp->::ccc::FF3x8y14::~FF3x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y14E(Test__ZN3ccc8FF3x8y14E, "_ZN3ccc8FF3x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y14C1Ev();
extern void _ZN3ccc8FF3x8y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y14E[] = {
  NSPAIR(_ZN3ccc8FF3x8y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x8y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x8y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y14E[] = {
  {&(_ZTVN3ccc8FF3x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y14E[];
static VTBL_ENTRY alt_thunk_names863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y14E = {  "_ZN3ccc8FF3x8y14E", // class name
  bases__ZN3ccc8FF3x8y14E, 2,
  &(vtc__ZN3ccc8FF3x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names863,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x8y15  : virtual ::ccc::EE3x8 {
  ~FF3x8y15(); // tgen
  FF3x8y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x8y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2}}
}
namespace ccc { 
ccc::FF3x8y15 ::~FF3x8y15(){ note_dtor("_ZN3ccc8FF3x8y15E", this);} // tgen
ccc::FF3x8y15 ::FF3x8y15(){ note_ctor("_ZN3ccc8FF3x8y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x8y15E, buf);
    ::ccc::FF3x8y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x8y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y15E");
    check_base_class_offset(lv, (::ccc::EE3x8*), 0, "_ZN3ccc8FF3x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x8y15E);
    dp->::ccc::FF3x8y15::~FF3x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x8y15E(Test__ZN3ccc8FF3x8y15E, "_ZN3ccc8FF3x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x8y15C1Ev();
extern void _ZN3ccc8FF3x8y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x8y15E[] = {
  NSPAIR(_ZN3ccc8FF3x8y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x8E[];
static Base_Class bases__ZN3ccc8FF3x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x8y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x8y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv)();
extern void _ZN3ccc5EE3x83efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv)();
extern void _ZN3ccc5EE3x83abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x8y15E[] = {
  {&(_ZTVN3ccc8FF3x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x8y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x8E__NS_8FF3x8y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x8y15E[];
static VTBL_ENTRY alt_thunk_names864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE3x83abcEv,_ZTv0_n20_N3ccc5EE3x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x83efgEv,_ZTv0_n12_N3ccc5EE3x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x8y15E = {  "_ZN3ccc8FF3x8y15E", // class name
  bases__ZN3ccc8FF3x8y15E, 2,
  &(vtc__ZN3ccc8FF3x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x8y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x8y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x8y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x8y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names864,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y0  : virtual ::ccc::EE3x9 {
  virtual void  abc(); // _ZN3ccc7FF3x9y03abcEv
  virtual void  efg(); // _ZN3ccc7FF3x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y03pqrEv
  ~FF3x9y0(); // tgen
  FF3x9y0(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y03abcEv");}
void  ccc::FF3x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y03efgEv");}
void  ccc::FF3x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y03pqrEv");}
ccc::FF3x9y0 ::~FF3x9y0(){ note_dtor("_ZN3ccc7FF3x9y0E", this);} // tgen
ccc::FF3x9y0 ::FF3x9y0(){ note_ctor("_ZN3ccc7FF3x9y0E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y0E, buf);
    ::ccc::FF3x9y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y0E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y0E);
    dp->::ccc::FF3x9y0::~FF3x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y0E(Test__ZN3ccc7FF3x9y0E, "_ZN3ccc7FF3x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y0C1Ev();
extern void _ZN3ccc7FF3x9y0D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y0E[] = {
  NSPAIR(_ZN3ccc7FF3x9y0C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y0E[];
extern void _ZN3ccc7FF3x9y03efgEv();
extern void _ZN3ccc7FF3x9y03pqrEv();
extern void _ZN3ccc7FF3x9y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y0E[] = {
  {&(_ZTVN3ccc7FF3x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y0E[];
static VTBL_ENTRY alt_thunk_names865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y0E = {  "_ZN3ccc7FF3x9y0E", // class name
  bases__ZN3ccc7FF3x9y0E, 2,
  &(vtc__ZN3ccc7FF3x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names865,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y1  : virtual ::ccc::EE3x9 {
  virtual void  abc(); // _ZN3ccc7FF3x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x9y13efgEv
  ~FF3x9y1(); // tgen
  FF3x9y1(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y13abcEv");}
void  ccc::FF3x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y13pqrEv");}
void  ccc::FF3x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y13efgEv");}
ccc::FF3x9y1 ::~FF3x9y1(){ note_dtor("_ZN3ccc7FF3x9y1E", this);} // tgen
ccc::FF3x9y1 ::FF3x9y1(){ note_ctor("_ZN3ccc7FF3x9y1E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y1E, buf);
    ::ccc::FF3x9y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y1E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y1E);
    dp->::ccc::FF3x9y1::~FF3x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y1E(Test__ZN3ccc7FF3x9y1E, "_ZN3ccc7FF3x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y1C1Ev();
extern void _ZN3ccc7FF3x9y1D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y1E[] = {
  NSPAIR(_ZN3ccc7FF3x9y1C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y1E[];
extern void _ZN3ccc7FF3x9y13efgEv();
extern void _ZN3ccc7FF3x9y13pqrEv();
extern void _ZN3ccc7FF3x9y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y1E[] = {
  {&(_ZTVN3ccc7FF3x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y1E[];
static VTBL_ENTRY alt_thunk_names866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y1E = {  "_ZN3ccc7FF3x9y1E", // class name
  bases__ZN3ccc7FF3x9y1E, 2,
  &(vtc__ZN3ccc7FF3x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names866,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y2  : virtual ::ccc::EE3x9 {
  virtual void  efg(); // _ZN3ccc7FF3x9y23efgEv
  virtual void  abc(); // _ZN3ccc7FF3x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y23pqrEv
  ~FF3x9y2(); // tgen
  FF3x9y2(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y23efgEv");}
void  ccc::FF3x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y23abcEv");}
void  ccc::FF3x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y23pqrEv");}
ccc::FF3x9y2 ::~FF3x9y2(){ note_dtor("_ZN3ccc7FF3x9y2E", this);} // tgen
ccc::FF3x9y2 ::FF3x9y2(){ note_ctor("_ZN3ccc7FF3x9y2E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y2E, buf);
    ::ccc::FF3x9y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y2E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y2E);
    dp->::ccc::FF3x9y2::~FF3x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y2E(Test__ZN3ccc7FF3x9y2E, "_ZN3ccc7FF3x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y2C1Ev();
extern void _ZN3ccc7FF3x9y2D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y2E[] = {
  NSPAIR(_ZN3ccc7FF3x9y2C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y2E[];
extern void _ZN3ccc7FF3x9y23efgEv();
extern void _ZN3ccc7FF3x9y23pqrEv();
extern void _ZN3ccc7FF3x9y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y2E[] = {
  {&(_ZTVN3ccc7FF3x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y2E[];
static VTBL_ENTRY alt_thunk_names867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y2E = {  "_ZN3ccc7FF3x9y2E", // class name
  bases__ZN3ccc7FF3x9y2E, 2,
  &(vtc__ZN3ccc7FF3x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names867,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y3  : virtual ::ccc::EE3x9 {
  virtual void  efg(); // _ZN3ccc7FF3x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x9y33abcEv
  ~FF3x9y3(); // tgen
  FF3x9y3(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y33efgEv");}
void  ccc::FF3x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y33pqrEv");}
void  ccc::FF3x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y33abcEv");}
ccc::FF3x9y3 ::~FF3x9y3(){ note_dtor("_ZN3ccc7FF3x9y3E", this);} // tgen
ccc::FF3x9y3 ::FF3x9y3(){ note_ctor("_ZN3ccc7FF3x9y3E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y3E, buf);
    ::ccc::FF3x9y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y3E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y3E);
    dp->::ccc::FF3x9y3::~FF3x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y3E(Test__ZN3ccc7FF3x9y3E, "_ZN3ccc7FF3x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y3C1Ev();
extern void _ZN3ccc7FF3x9y3D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y3E[] = {
  NSPAIR(_ZN3ccc7FF3x9y3C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y3E[];
extern void _ZN3ccc7FF3x9y33efgEv();
extern void _ZN3ccc7FF3x9y33pqrEv();
extern void _ZN3ccc7FF3x9y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y3E[] = {
  {&(_ZTVN3ccc7FF3x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y3E[];
static VTBL_ENTRY alt_thunk_names868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y3E = {  "_ZN3ccc7FF3x9y3E", // class name
  bases__ZN3ccc7FF3x9y3E, 2,
  &(vtc__ZN3ccc7FF3x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names868,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y4  : virtual ::ccc::EE3x9 {
  virtual void  pqr(); // _ZN3ccc7FF3x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF3x9y43abcEv
  virtual void  efg(); // _ZN3ccc7FF3x9y43efgEv
  ~FF3x9y4(); // tgen
  FF3x9y4(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y43pqrEv");}
void  ccc::FF3x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y43abcEv");}
void  ccc::FF3x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y43efgEv");}
ccc::FF3x9y4 ::~FF3x9y4(){ note_dtor("_ZN3ccc7FF3x9y4E", this);} // tgen
ccc::FF3x9y4 ::FF3x9y4(){ note_ctor("_ZN3ccc7FF3x9y4E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y4E, buf);
    ::ccc::FF3x9y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y4E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y4E);
    dp->::ccc::FF3x9y4::~FF3x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y4E(Test__ZN3ccc7FF3x9y4E, "_ZN3ccc7FF3x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y4C1Ev();
extern void _ZN3ccc7FF3x9y4D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y4E[] = {
  NSPAIR(_ZN3ccc7FF3x9y4C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y4E[];
extern void _ZN3ccc7FF3x9y43efgEv();
extern void _ZN3ccc7FF3x9y43pqrEv();
extern void _ZN3ccc7FF3x9y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y4E[] = {
  {&(_ZTVN3ccc7FF3x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y4E[];
static VTBL_ENTRY alt_thunk_names869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y4E = {  "_ZN3ccc7FF3x9y4E", // class name
  bases__ZN3ccc7FF3x9y4E, 2,
  &(vtc__ZN3ccc7FF3x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names869,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y5  : virtual ::ccc::EE3x9 {
  virtual void  pqr(); // _ZN3ccc7FF3x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF3x9y53efgEv
  virtual void  abc(); // _ZN3ccc7FF3x9y53abcEv
  ~FF3x9y5(); // tgen
  FF3x9y5(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y53pqrEv");}
void  ccc::FF3x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y53efgEv");}
void  ccc::FF3x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y53abcEv");}
ccc::FF3x9y5 ::~FF3x9y5(){ note_dtor("_ZN3ccc7FF3x9y5E", this);} // tgen
ccc::FF3x9y5 ::FF3x9y5(){ note_ctor("_ZN3ccc7FF3x9y5E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y5E, buf);
    ::ccc::FF3x9y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y5E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y5E);
    dp->::ccc::FF3x9y5::~FF3x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y5E(Test__ZN3ccc7FF3x9y5E, "_ZN3ccc7FF3x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y5C1Ev();
extern void _ZN3ccc7FF3x9y5D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y5E[] = {
  NSPAIR(_ZN3ccc7FF3x9y5C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y5E[];
extern void _ZN3ccc7FF3x9y53efgEv();
extern void _ZN3ccc7FF3x9y53pqrEv();
extern void _ZN3ccc7FF3x9y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y5E[] = {
  {&(_ZTVN3ccc7FF3x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y5E[];
static VTBL_ENTRY alt_thunk_names870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y5E = {  "_ZN3ccc7FF3x9y5E", // class name
  bases__ZN3ccc7FF3x9y5E, 2,
  &(vtc__ZN3ccc7FF3x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names870,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y6  : virtual ::ccc::EE3x9 {
  virtual void  abc(); // _ZN3ccc7FF3x9y63abcEv
  virtual void  efg(); // _ZN3ccc7FF3x9y63efgEv
  ~FF3x9y6(); // tgen
  FF3x9y6(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y63abcEv");}
void  ccc::FF3x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y63efgEv");}
ccc::FF3x9y6 ::~FF3x9y6(){ note_dtor("_ZN3ccc7FF3x9y6E", this);} // tgen
ccc::FF3x9y6 ::FF3x9y6(){ note_ctor("_ZN3ccc7FF3x9y6E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y6E, buf);
    ::ccc::FF3x9y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y6E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y6E);
    dp->::ccc::FF3x9y6::~FF3x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y6E(Test__ZN3ccc7FF3x9y6E, "_ZN3ccc7FF3x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y6C1Ev();
extern void _ZN3ccc7FF3x9y6D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y6E[] = {
  NSPAIR(_ZN3ccc7FF3x9y6C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y6E[];
extern void _ZN3ccc7FF3x9y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x9y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y6E[] = {
  {&(_ZTVN3ccc7FF3x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y6E[];
static VTBL_ENTRY alt_thunk_names871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y6E = {  "_ZN3ccc7FF3x9y6E", // class name
  bases__ZN3ccc7FF3x9y6E, 2,
  &(vtc__ZN3ccc7FF3x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names871,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y7  : virtual ::ccc::EE3x9 {
  virtual void  abc(); // _ZN3ccc7FF3x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y73pqrEv
  ~FF3x9y7(); // tgen
  FF3x9y7(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y73abcEv");}
void  ccc::FF3x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y73pqrEv");}
ccc::FF3x9y7 ::~FF3x9y7(){ note_dtor("_ZN3ccc7FF3x9y7E", this);} // tgen
ccc::FF3x9y7 ::FF3x9y7(){ note_ctor("_ZN3ccc7FF3x9y7E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y7E, buf);
    ::ccc::FF3x9y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y7E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y7E);
    dp->::ccc::FF3x9y7::~FF3x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y7E(Test__ZN3ccc7FF3x9y7E, "_ZN3ccc7FF3x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y7C1Ev();
extern void _ZN3ccc7FF3x9y7D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y7E[] = {
  NSPAIR(_ZN3ccc7FF3x9y7C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void _ZN3ccc7FF3x9y73pqrEv();
extern void _ZN3ccc7FF3x9y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y7E[] = {
  {&(_ZTVN3ccc7FF3x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y7E[];
static VTBL_ENTRY alt_thunk_names872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y7E = {  "_ZN3ccc7FF3x9y7E", // class name
  bases__ZN3ccc7FF3x9y7E, 2,
  &(vtc__ZN3ccc7FF3x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names872,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y8  : virtual ::ccc::EE3x9 {
  virtual void  efg(); // _ZN3ccc7FF3x9y83efgEv
  virtual void  abc(); // _ZN3ccc7FF3x9y83abcEv
  ~FF3x9y8(); // tgen
  FF3x9y8(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y83efgEv");}
void  ccc::FF3x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF3x9y83abcEv");}
ccc::FF3x9y8 ::~FF3x9y8(){ note_dtor("_ZN3ccc7FF3x9y8E", this);} // tgen
ccc::FF3x9y8 ::FF3x9y8(){ note_ctor("_ZN3ccc7FF3x9y8E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y8E, buf);
    ::ccc::FF3x9y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y8E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y8E);
    dp->::ccc::FF3x9y8::~FF3x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y8E(Test__ZN3ccc7FF3x9y8E, "_ZN3ccc7FF3x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y8C1Ev();
extern void _ZN3ccc7FF3x9y8D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y8E[] = {
  NSPAIR(_ZN3ccc7FF3x9y8C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y8E[];
extern void _ZN3ccc7FF3x9y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF3x9y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y8E[] = {
  {&(_ZTVN3ccc7FF3x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y8E[];
static VTBL_ENTRY alt_thunk_names873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y8E = {  "_ZN3ccc7FF3x9y8E", // class name
  bases__ZN3ccc7FF3x9y8E, 2,
  &(vtc__ZN3ccc7FF3x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names873,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y9  : virtual ::ccc::EE3x9 {
  virtual void  efg(); // _ZN3ccc7FF3x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF3x9y93pqrEv
  ~FF3x9y9(); // tgen
  FF3x9y9(); // tgen
};
//SIG(1 _ZN3ccc7FF3x9y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF3x9y93efgEv");}
void  ccc::FF3x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF3x9y93pqrEv");}
ccc::FF3x9y9 ::~FF3x9y9(){ note_dtor("_ZN3ccc7FF3x9y9E", this);} // tgen
ccc::FF3x9y9 ::FF3x9y9(){ note_ctor("_ZN3ccc7FF3x9y9E", this);} // tgen
}
static void Test__ZN3ccc7FF3x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF3x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF3x9y9E, buf);
    ::ccc::FF3x9y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF3x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF3x9y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y9E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc7FF3x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF3x9y9E);
    dp->::ccc::FF3x9y9::~FF3x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF3x9y9E(Test__ZN3ccc7FF3x9y9E, "_ZN3ccc7FF3x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF3x9y9C1Ev();
extern void _ZN3ccc7FF3x9y9D1Ev();
Name_Map name_map__ZN3ccc7FF3x9y9E[] = {
  NSPAIR(_ZN3ccc7FF3x9y9C1Ev),
  NSPAIR(_ZN3ccc7FF3x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc7FF3x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y9E[];
extern void _ZN3ccc7FF3x9y93efgEv();
extern void _ZN3ccc7FF3x9y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF3x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF3x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7FF3x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF3x9y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF3x9y9E[] = {
  {&(_ZTVN3ccc7FF3x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF3x9y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_7FF3x9y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF3x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF3x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF3x9y9E[];
static VTBL_ENTRY alt_thunk_names874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF3x9y9E = {  "_ZN3ccc7FF3x9y9E", // class name
  bases__ZN3ccc7FF3x9y9E, 2,
  &(vtc__ZN3ccc7FF3x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF3x9y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF3x9y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF3x9y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF3x9y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names874,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y10  : virtual ::ccc::EE3x9 {
  virtual void  pqr(); // _ZN3ccc8FF3x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x9y103abcEv
  ~FF3x9y10(); // tgen
  FF3x9y10(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x9y103pqrEv");}
void  ccc::FF3x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x9y103abcEv");}
ccc::FF3x9y10 ::~FF3x9y10(){ note_dtor("_ZN3ccc8FF3x9y10E", this);} // tgen
ccc::FF3x9y10 ::FF3x9y10(){ note_ctor("_ZN3ccc8FF3x9y10E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y10E, buf);
    ::ccc::FF3x9y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y10E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y10E);
    dp->::ccc::FF3x9y10::~FF3x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y10E(Test__ZN3ccc8FF3x9y10E, "_ZN3ccc8FF3x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y10C1Ev();
extern void _ZN3ccc8FF3x9y10D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y10E[] = {
  NSPAIR(_ZN3ccc8FF3x9y10C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x9y103pqrEv();
extern void _ZN3ccc8FF3x9y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y10E[] = {
  {&(_ZTVN3ccc8FF3x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y10E[];
static VTBL_ENTRY alt_thunk_names875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y10E = {  "_ZN3ccc8FF3x9y10E", // class name
  bases__ZN3ccc8FF3x9y10E, 2,
  &(vtc__ZN3ccc8FF3x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names875,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y11  : virtual ::ccc::EE3x9 {
  virtual void  pqr(); // _ZN3ccc8FF3x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x9y113efgEv
  ~FF3x9y11(); // tgen
  FF3x9y11(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x9y113pqrEv");}
void  ccc::FF3x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x9y113efgEv");}
ccc::FF3x9y11 ::~FF3x9y11(){ note_dtor("_ZN3ccc8FF3x9y11E", this);} // tgen
ccc::FF3x9y11 ::FF3x9y11(){ note_ctor("_ZN3ccc8FF3x9y11E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y11E, buf);
    ::ccc::FF3x9y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y11E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y11E);
    dp->::ccc::FF3x9y11::~FF3x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y11E(Test__ZN3ccc8FF3x9y11E, "_ZN3ccc8FF3x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y11C1Ev();
extern void _ZN3ccc8FF3x9y11D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y11E[] = {
  NSPAIR(_ZN3ccc8FF3x9y11C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y11E[];
extern void _ZN3ccc8FF3x9y113efgEv();
extern void _ZN3ccc8FF3x9y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y11E[] = {
  {&(_ZTVN3ccc8FF3x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y11E[];
static VTBL_ENTRY alt_thunk_names876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y11E = {  "_ZN3ccc8FF3x9y11E", // class name
  bases__ZN3ccc8FF3x9y11E, 2,
  &(vtc__ZN3ccc8FF3x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names876,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y12  : virtual ::ccc::EE3x9 {
  virtual void  abc(); // _ZN3ccc8FF3x9y123abcEv
  ~FF3x9y12(); // tgen
  FF3x9y12(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x9y123abcEv");}
ccc::FF3x9y12 ::~FF3x9y12(){ note_dtor("_ZN3ccc8FF3x9y12E", this);} // tgen
ccc::FF3x9y12 ::FF3x9y12(){ note_ctor("_ZN3ccc8FF3x9y12E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y12E, buf);
    ::ccc::FF3x9y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y12E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y12E);
    dp->::ccc::FF3x9y12::~FF3x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y12E(Test__ZN3ccc8FF3x9y12E, "_ZN3ccc8FF3x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y12C1Ev();
extern void _ZN3ccc8FF3x9y12D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y12E[] = {
  NSPAIR(_ZN3ccc8FF3x9y12C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x9y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y12E[] = {
  {&(_ZTVN3ccc8FF3x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y12E[];
static VTBL_ENTRY alt_thunk_names877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y12E = {  "_ZN3ccc8FF3x9y12E", // class name
  bases__ZN3ccc8FF3x9y12E, 2,
  &(vtc__ZN3ccc8FF3x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names877,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y13  : virtual ::ccc::EE3x9 {
  virtual void  efg(); // _ZN3ccc8FF3x9y133efgEv
  ~FF3x9y13(); // tgen
  FF3x9y13(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x9y133efgEv");}
ccc::FF3x9y13 ::~FF3x9y13(){ note_dtor("_ZN3ccc8FF3x9y13E", this);} // tgen
ccc::FF3x9y13 ::FF3x9y13(){ note_ctor("_ZN3ccc8FF3x9y13E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y13E, buf);
    ::ccc::FF3x9y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y13E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y13E);
    dp->::ccc::FF3x9y13::~FF3x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y13E(Test__ZN3ccc8FF3x9y13E, "_ZN3ccc8FF3x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y13C1Ev();
extern void _ZN3ccc8FF3x9y13D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y13E[] = {
  NSPAIR(_ZN3ccc8FF3x9y13C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y13E[];
extern void _ZN3ccc8FF3x9y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y13E[] = {
  {&(_ZTVN3ccc8FF3x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y13E[];
static VTBL_ENTRY alt_thunk_names878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y13E = {  "_ZN3ccc8FF3x9y13E", // class name
  bases__ZN3ccc8FF3x9y13E, 2,
  &(vtc__ZN3ccc8FF3x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names878,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y14  : virtual ::ccc::EE3x9 {
  virtual void  pqr(); // _ZN3ccc8FF3x9y143pqrEv
  ~FF3x9y14(); // tgen
  FF3x9y14(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x9y143pqrEv");}
ccc::FF3x9y14 ::~FF3x9y14(){ note_dtor("_ZN3ccc8FF3x9y14E", this);} // tgen
ccc::FF3x9y14 ::FF3x9y14(){ note_ctor("_ZN3ccc8FF3x9y14E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y14E, buf);
    ::ccc::FF3x9y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y14E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y14E);
    dp->::ccc::FF3x9y14::~FF3x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y14E(Test__ZN3ccc8FF3x9y14E, "_ZN3ccc8FF3x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y14C1Ev();
extern void _ZN3ccc8FF3x9y14D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y14E[] = {
  NSPAIR(_ZN3ccc8FF3x9y14C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x9y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y14E[] = {
  {&(_ZTVN3ccc8FF3x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y14E[];
static VTBL_ENTRY alt_thunk_names879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y14E = {  "_ZN3ccc8FF3x9y14E", // class name
  bases__ZN3ccc8FF3x9y14E, 2,
  &(vtc__ZN3ccc8FF3x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names879,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x9y15  : virtual ::ccc::EE3x9 {
  ~FF3x9y15(); // tgen
  FF3x9y15(); // tgen
};
//SIG(1 _ZN3ccc8FF3x9y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2}}
}
namespace ccc { 
ccc::FF3x9y15 ::~FF3x9y15(){ note_dtor("_ZN3ccc8FF3x9y15E", this);} // tgen
ccc::FF3x9y15 ::FF3x9y15(){ note_ctor("_ZN3ccc8FF3x9y15E", this);} // tgen
}
static void Test__ZN3ccc8FF3x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x9y15E, buf);
    ::ccc::FF3x9y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x9y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y15E");
    check_base_class_offset(lv, (::ccc::EE3x9*), 0, "_ZN3ccc8FF3x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x9y15E);
    dp->::ccc::FF3x9y15::~FF3x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x9y15E(Test__ZN3ccc8FF3x9y15E, "_ZN3ccc8FF3x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x9y15C1Ev();
extern void _ZN3ccc8FF3x9y15D1Ev();
Name_Map name_map__ZN3ccc8FF3x9y15E[] = {
  NSPAIR(_ZN3ccc8FF3x9y15C1Ev),
  NSPAIR(_ZN3ccc8FF3x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc5EE3x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE3x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE3x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE3x9E[];
static Base_Class bases__ZN3ccc8FF3x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE3x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x9y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv)();
extern void _ZN3ccc5EE3x93efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv)();
extern void _ZN3ccc5EE3x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE3x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x9y15E[] = {
  {&(_ZTVN3ccc8FF3x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x9y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE3x9E__NS_8FF3x9y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x9y15E[];
static VTBL_ENTRY alt_thunk_names880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE3x93pqrEv,_ZTv0_n16_N3ccc5EE3x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE3x93efgEv,_ZTv0_n12_N3ccc5EE3x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE3x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x9y15E = {  "_ZN3ccc8FF3x9y15E", // class name
  bases__ZN3ccc8FF3x9y15E, 2,
  &(vtc__ZN3ccc8FF3x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x9y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x9y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x9y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x9y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names880,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y0  : virtual ::ccc::EE3x10 {
  virtual void  abc(); // _ZN3ccc8FF3x10y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y03pqrEv
  ~FF3x10y0(); // tgen
  FF3x10y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y03abcEv");}
void  ccc::FF3x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y03efgEv");}
void  ccc::FF3x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y03pqrEv");}
ccc::FF3x10y0 ::~FF3x10y0(){ note_dtor("_ZN3ccc8FF3x10y0E", this);} // tgen
ccc::FF3x10y0 ::FF3x10y0(){ note_ctor("_ZN3ccc8FF3x10y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y0E, buf);
    ::ccc::FF3x10y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y0E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y0E);
    dp->::ccc::FF3x10y0::~FF3x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y0E(Test__ZN3ccc8FF3x10y0E, "_ZN3ccc8FF3x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y0C1Ev();
extern void _ZN3ccc8FF3x10y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y0E[] = {
  NSPAIR(_ZN3ccc8FF3x10y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y0E[];
extern void _ZN3ccc8FF3x10y03efgEv();
extern void _ZN3ccc8FF3x10y03pqrEv();
extern void _ZN3ccc8FF3x10y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y0E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y0E[] = {
  {&(_ZTVN3ccc8FF3x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y0E[];
static VTBL_ENTRY alt_thunk_names881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y0E = {  "_ZN3ccc8FF3x10y0E", // class name
  bases__ZN3ccc8FF3x10y0E, 2,
  &(vtc__ZN3ccc8FF3x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names881,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y1  : virtual ::ccc::EE3x10 {
  virtual void  abc(); // _ZN3ccc8FF3x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x10y13efgEv
  ~FF3x10y1(); // tgen
  FF3x10y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y13abcEv");}
void  ccc::FF3x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y13pqrEv");}
void  ccc::FF3x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y13efgEv");}
ccc::FF3x10y1 ::~FF3x10y1(){ note_dtor("_ZN3ccc8FF3x10y1E", this);} // tgen
ccc::FF3x10y1 ::FF3x10y1(){ note_ctor("_ZN3ccc8FF3x10y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y1E, buf);
    ::ccc::FF3x10y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y1E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y1E);
    dp->::ccc::FF3x10y1::~FF3x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y1E(Test__ZN3ccc8FF3x10y1E, "_ZN3ccc8FF3x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y1C1Ev();
extern void _ZN3ccc8FF3x10y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y1E[] = {
  NSPAIR(_ZN3ccc8FF3x10y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y1E[];
extern void _ZN3ccc8FF3x10y13efgEv();
extern void _ZN3ccc8FF3x10y13pqrEv();
extern void _ZN3ccc8FF3x10y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y1E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y1E[] = {
  {&(_ZTVN3ccc8FF3x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y1E[];
static VTBL_ENTRY alt_thunk_names882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y1E = {  "_ZN3ccc8FF3x10y1E", // class name
  bases__ZN3ccc8FF3x10y1E, 2,
  &(vtc__ZN3ccc8FF3x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names882,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y2  : virtual ::ccc::EE3x10 {
  virtual void  efg(); // _ZN3ccc8FF3x10y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y23pqrEv
  ~FF3x10y2(); // tgen
  FF3x10y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y23efgEv");}
void  ccc::FF3x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y23abcEv");}
void  ccc::FF3x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y23pqrEv");}
ccc::FF3x10y2 ::~FF3x10y2(){ note_dtor("_ZN3ccc8FF3x10y2E", this);} // tgen
ccc::FF3x10y2 ::FF3x10y2(){ note_ctor("_ZN3ccc8FF3x10y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y2E, buf);
    ::ccc::FF3x10y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y2E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y2E);
    dp->::ccc::FF3x10y2::~FF3x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y2E(Test__ZN3ccc8FF3x10y2E, "_ZN3ccc8FF3x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y2C1Ev();
extern void _ZN3ccc8FF3x10y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y2E[] = {
  NSPAIR(_ZN3ccc8FF3x10y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y2E[];
extern void _ZN3ccc8FF3x10y23efgEv();
extern void _ZN3ccc8FF3x10y23pqrEv();
extern void _ZN3ccc8FF3x10y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y2E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y2E[] = {
  {&(_ZTVN3ccc8FF3x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y2E[];
static VTBL_ENTRY alt_thunk_names883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y2E = {  "_ZN3ccc8FF3x10y2E", // class name
  bases__ZN3ccc8FF3x10y2E, 2,
  &(vtc__ZN3ccc8FF3x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names883,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y3  : virtual ::ccc::EE3x10 {
  virtual void  efg(); // _ZN3ccc8FF3x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x10y33abcEv
  ~FF3x10y3(); // tgen
  FF3x10y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y33efgEv");}
void  ccc::FF3x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y33pqrEv");}
void  ccc::FF3x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y33abcEv");}
ccc::FF3x10y3 ::~FF3x10y3(){ note_dtor("_ZN3ccc8FF3x10y3E", this);} // tgen
ccc::FF3x10y3 ::FF3x10y3(){ note_ctor("_ZN3ccc8FF3x10y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y3E, buf);
    ::ccc::FF3x10y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y3E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y3E);
    dp->::ccc::FF3x10y3::~FF3x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y3E(Test__ZN3ccc8FF3x10y3E, "_ZN3ccc8FF3x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y3C1Ev();
extern void _ZN3ccc8FF3x10y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y3E[] = {
  NSPAIR(_ZN3ccc8FF3x10y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y3E[];
extern void _ZN3ccc8FF3x10y33efgEv();
extern void _ZN3ccc8FF3x10y33pqrEv();
extern void _ZN3ccc8FF3x10y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y3E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y3E[] = {
  {&(_ZTVN3ccc8FF3x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y3E[];
static VTBL_ENTRY alt_thunk_names884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y3E = {  "_ZN3ccc8FF3x10y3E", // class name
  bases__ZN3ccc8FF3x10y3E, 2,
  &(vtc__ZN3ccc8FF3x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names884,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y4  : virtual ::ccc::EE3x10 {
  virtual void  pqr(); // _ZN3ccc8FF3x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x10y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x10y43efgEv
  ~FF3x10y4(); // tgen
  FF3x10y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y43pqrEv");}
void  ccc::FF3x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y43abcEv");}
void  ccc::FF3x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y43efgEv");}
ccc::FF3x10y4 ::~FF3x10y4(){ note_dtor("_ZN3ccc8FF3x10y4E", this);} // tgen
ccc::FF3x10y4 ::FF3x10y4(){ note_ctor("_ZN3ccc8FF3x10y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y4E, buf);
    ::ccc::FF3x10y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y4E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y4E);
    dp->::ccc::FF3x10y4::~FF3x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y4E(Test__ZN3ccc8FF3x10y4E, "_ZN3ccc8FF3x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y4C1Ev();
extern void _ZN3ccc8FF3x10y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y4E[] = {
  NSPAIR(_ZN3ccc8FF3x10y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y4E[];
extern void _ZN3ccc8FF3x10y43efgEv();
extern void _ZN3ccc8FF3x10y43pqrEv();
extern void _ZN3ccc8FF3x10y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y4E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y4E[] = {
  {&(_ZTVN3ccc8FF3x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y4E[];
static VTBL_ENTRY alt_thunk_names885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y4E = {  "_ZN3ccc8FF3x10y4E", // class name
  bases__ZN3ccc8FF3x10y4E, 2,
  &(vtc__ZN3ccc8FF3x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names885,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y5  : virtual ::ccc::EE3x10 {
  virtual void  pqr(); // _ZN3ccc8FF3x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x10y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x10y53abcEv
  ~FF3x10y5(); // tgen
  FF3x10y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y53pqrEv");}
void  ccc::FF3x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y53efgEv");}
void  ccc::FF3x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y53abcEv");}
ccc::FF3x10y5 ::~FF3x10y5(){ note_dtor("_ZN3ccc8FF3x10y5E", this);} // tgen
ccc::FF3x10y5 ::FF3x10y5(){ note_ctor("_ZN3ccc8FF3x10y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y5E, buf);
    ::ccc::FF3x10y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y5E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y5E);
    dp->::ccc::FF3x10y5::~FF3x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y5E(Test__ZN3ccc8FF3x10y5E, "_ZN3ccc8FF3x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y5C1Ev();
extern void _ZN3ccc8FF3x10y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y5E[] = {
  NSPAIR(_ZN3ccc8FF3x10y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y5E[];
extern void _ZN3ccc8FF3x10y53efgEv();
extern void _ZN3ccc8FF3x10y53pqrEv();
extern void _ZN3ccc8FF3x10y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y5E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y5E[] = {
  {&(_ZTVN3ccc8FF3x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y5E[];
static VTBL_ENTRY alt_thunk_names886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y5E = {  "_ZN3ccc8FF3x10y5E", // class name
  bases__ZN3ccc8FF3x10y5E, 2,
  &(vtc__ZN3ccc8FF3x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names886,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y6  : virtual ::ccc::EE3x10 {
  virtual void  abc(); // _ZN3ccc8FF3x10y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x10y63efgEv
  ~FF3x10y6(); // tgen
  FF3x10y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y63abcEv");}
void  ccc::FF3x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y63efgEv");}
ccc::FF3x10y6 ::~FF3x10y6(){ note_dtor("_ZN3ccc8FF3x10y6E", this);} // tgen
ccc::FF3x10y6 ::FF3x10y6(){ note_ctor("_ZN3ccc8FF3x10y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y6E, buf);
    ::ccc::FF3x10y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y6E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y6E);
    dp->::ccc::FF3x10y6::~FF3x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y6E(Test__ZN3ccc8FF3x10y6E, "_ZN3ccc8FF3x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y6C1Ev();
extern void _ZN3ccc8FF3x10y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y6E[] = {
  NSPAIR(_ZN3ccc8FF3x10y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y6E[];
extern void _ZN3ccc8FF3x10y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x10y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y6E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y6E[] = {
  {&(_ZTVN3ccc8FF3x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y6E[];
static VTBL_ENTRY alt_thunk_names887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y6E = {  "_ZN3ccc8FF3x10y6E", // class name
  bases__ZN3ccc8FF3x10y6E, 2,
  &(vtc__ZN3ccc8FF3x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names887,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y7  : virtual ::ccc::EE3x10 {
  virtual void  abc(); // _ZN3ccc8FF3x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y73pqrEv
  ~FF3x10y7(); // tgen
  FF3x10y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y73abcEv");}
void  ccc::FF3x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y73pqrEv");}
ccc::FF3x10y7 ::~FF3x10y7(){ note_dtor("_ZN3ccc8FF3x10y7E", this);} // tgen
ccc::FF3x10y7 ::FF3x10y7(){ note_ctor("_ZN3ccc8FF3x10y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y7E, buf);
    ::ccc::FF3x10y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y7E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y7E);
    dp->::ccc::FF3x10y7::~FF3x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y7E(Test__ZN3ccc8FF3x10y7E, "_ZN3ccc8FF3x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y7C1Ev();
extern void _ZN3ccc8FF3x10y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y7E[] = {
  NSPAIR(_ZN3ccc8FF3x10y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x10y73pqrEv();
extern void _ZN3ccc8FF3x10y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y7E[] = {
  {&(_ZTVN3ccc8FF3x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y7E[];
static VTBL_ENTRY alt_thunk_names888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y7E = {  "_ZN3ccc8FF3x10y7E", // class name
  bases__ZN3ccc8FF3x10y7E, 2,
  &(vtc__ZN3ccc8FF3x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names888,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y8  : virtual ::ccc::EE3x10 {
  virtual void  efg(); // _ZN3ccc8FF3x10y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x10y83abcEv
  ~FF3x10y8(); // tgen
  FF3x10y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y83efgEv");}
void  ccc::FF3x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x10y83abcEv");}
ccc::FF3x10y8 ::~FF3x10y8(){ note_dtor("_ZN3ccc8FF3x10y8E", this);} // tgen
ccc::FF3x10y8 ::FF3x10y8(){ note_ctor("_ZN3ccc8FF3x10y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y8E, buf);
    ::ccc::FF3x10y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y8E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y8E);
    dp->::ccc::FF3x10y8::~FF3x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y8E(Test__ZN3ccc8FF3x10y8E, "_ZN3ccc8FF3x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y8C1Ev();
extern void _ZN3ccc8FF3x10y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y8E[] = {
  NSPAIR(_ZN3ccc8FF3x10y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y8E[];
extern void _ZN3ccc8FF3x10y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x10y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y8E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y8E[] = {
  {&(_ZTVN3ccc8FF3x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y8E[];
static VTBL_ENTRY alt_thunk_names889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y8E = {  "_ZN3ccc8FF3x10y8E", // class name
  bases__ZN3ccc8FF3x10y8E, 2,
  &(vtc__ZN3ccc8FF3x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names889,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y9  : virtual ::ccc::EE3x10 {
  virtual void  efg(); // _ZN3ccc8FF3x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x10y93pqrEv
  ~FF3x10y9(); // tgen
  FF3x10y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x10y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x10y93efgEv");}
void  ccc::FF3x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x10y93pqrEv");}
ccc::FF3x10y9 ::~FF3x10y9(){ note_dtor("_ZN3ccc8FF3x10y9E", this);} // tgen
ccc::FF3x10y9 ::FF3x10y9(){ note_ctor("_ZN3ccc8FF3x10y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x10y9E, buf);
    ::ccc::FF3x10y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x10y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y9E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc8FF3x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x10y9E);
    dp->::ccc::FF3x10y9::~FF3x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x10y9E(Test__ZN3ccc8FF3x10y9E, "_ZN3ccc8FF3x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x10y9C1Ev();
extern void _ZN3ccc8FF3x10y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x10y9E[] = {
  NSPAIR(_ZN3ccc8FF3x10y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc8FF3x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y9E[];
extern void _ZN3ccc8FF3x10y93efgEv();
extern void _ZN3ccc8FF3x10y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x10y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x10y9E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x10y9E[] = {
  {&(_ZTVN3ccc8FF3x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x10y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_8FF3x10y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x10y9E[];
static VTBL_ENTRY alt_thunk_names890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x10y9E = {  "_ZN3ccc8FF3x10y9E", // class name
  bases__ZN3ccc8FF3x10y9E, 2,
  &(vtc__ZN3ccc8FF3x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x10y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x10y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x10y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x10y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names890,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y10  : virtual ::ccc::EE3x10 {
  virtual void  pqr(); // _ZN3ccc9FF3x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x10y103abcEv
  ~FF3x10y10(); // tgen
  FF3x10y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x10y103pqrEv");}
void  ccc::FF3x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x10y103abcEv");}
ccc::FF3x10y10 ::~FF3x10y10(){ note_dtor("_ZN3ccc9FF3x10y10E", this);} // tgen
ccc::FF3x10y10 ::FF3x10y10(){ note_ctor("_ZN3ccc9FF3x10y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y10E, buf);
    ::ccc::FF3x10y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y10E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y10E);
    dp->::ccc::FF3x10y10::~FF3x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y10E(Test__ZN3ccc9FF3x10y10E, "_ZN3ccc9FF3x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y10C1Ev();
extern void _ZN3ccc9FF3x10y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y10E[] = {
  NSPAIR(_ZN3ccc9FF3x10y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x10y103pqrEv();
extern void _ZN3ccc9FF3x10y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y10E[] = {
  {&(_ZTVN3ccc9FF3x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y10E[];
static VTBL_ENTRY alt_thunk_names891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y10E = {  "_ZN3ccc9FF3x10y10E", // class name
  bases__ZN3ccc9FF3x10y10E, 2,
  &(vtc__ZN3ccc9FF3x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names891,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y11  : virtual ::ccc::EE3x10 {
  virtual void  pqr(); // _ZN3ccc9FF3x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x10y113efgEv
  ~FF3x10y11(); // tgen
  FF3x10y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x10y113pqrEv");}
void  ccc::FF3x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x10y113efgEv");}
ccc::FF3x10y11 ::~FF3x10y11(){ note_dtor("_ZN3ccc9FF3x10y11E", this);} // tgen
ccc::FF3x10y11 ::FF3x10y11(){ note_ctor("_ZN3ccc9FF3x10y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y11E, buf);
    ::ccc::FF3x10y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y11E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y11E);
    dp->::ccc::FF3x10y11::~FF3x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y11E(Test__ZN3ccc9FF3x10y11E, "_ZN3ccc9FF3x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y11C1Ev();
extern void _ZN3ccc9FF3x10y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y11E[] = {
  NSPAIR(_ZN3ccc9FF3x10y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y11E[];
extern void _ZN3ccc9FF3x10y113efgEv();
extern void _ZN3ccc9FF3x10y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y11E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y11E[] = {
  {&(_ZTVN3ccc9FF3x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y11E[];
static VTBL_ENTRY alt_thunk_names892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y11E = {  "_ZN3ccc9FF3x10y11E", // class name
  bases__ZN3ccc9FF3x10y11E, 2,
  &(vtc__ZN3ccc9FF3x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names892,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y12  : virtual ::ccc::EE3x10 {
  virtual void  abc(); // _ZN3ccc9FF3x10y123abcEv
  ~FF3x10y12(); // tgen
  FF3x10y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x10y123abcEv");}
ccc::FF3x10y12 ::~FF3x10y12(){ note_dtor("_ZN3ccc9FF3x10y12E", this);} // tgen
ccc::FF3x10y12 ::FF3x10y12(){ note_ctor("_ZN3ccc9FF3x10y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y12E, buf);
    ::ccc::FF3x10y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y12E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y12E);
    dp->::ccc::FF3x10y12::~FF3x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y12E(Test__ZN3ccc9FF3x10y12E, "_ZN3ccc9FF3x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y12C1Ev();
extern void _ZN3ccc9FF3x10y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y12E[] = {
  NSPAIR(_ZN3ccc9FF3x10y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF3x10y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y12E[] = {
  {&(_ZTVN3ccc9FF3x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y12E[];
static VTBL_ENTRY alt_thunk_names893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y12E = {  "_ZN3ccc9FF3x10y12E", // class name
  bases__ZN3ccc9FF3x10y12E, 2,
  &(vtc__ZN3ccc9FF3x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names893,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y13  : virtual ::ccc::EE3x10 {
  virtual void  efg(); // _ZN3ccc9FF3x10y133efgEv
  ~FF3x10y13(); // tgen
  FF3x10y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x10y133efgEv");}
ccc::FF3x10y13 ::~FF3x10y13(){ note_dtor("_ZN3ccc9FF3x10y13E", this);} // tgen
ccc::FF3x10y13 ::FF3x10y13(){ note_ctor("_ZN3ccc9FF3x10y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y13E, buf);
    ::ccc::FF3x10y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y13E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y13E);
    dp->::ccc::FF3x10y13::~FF3x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y13E(Test__ZN3ccc9FF3x10y13E, "_ZN3ccc9FF3x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y13C1Ev();
extern void _ZN3ccc9FF3x10y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y13E[] = {
  NSPAIR(_ZN3ccc9FF3x10y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y13E[];
extern void _ZN3ccc9FF3x10y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y13E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y13E[] = {
  {&(_ZTVN3ccc9FF3x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y13E[];
static VTBL_ENTRY alt_thunk_names894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y13E = {  "_ZN3ccc9FF3x10y13E", // class name
  bases__ZN3ccc9FF3x10y13E, 2,
  &(vtc__ZN3ccc9FF3x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names894,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y14  : virtual ::ccc::EE3x10 {
  virtual void  pqr(); // _ZN3ccc9FF3x10y143pqrEv
  ~FF3x10y14(); // tgen
  FF3x10y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x10y143pqrEv");}
ccc::FF3x10y14 ::~FF3x10y14(){ note_dtor("_ZN3ccc9FF3x10y14E", this);} // tgen
ccc::FF3x10y14 ::FF3x10y14(){ note_ctor("_ZN3ccc9FF3x10y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y14E, buf);
    ::ccc::FF3x10y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y14E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y14E);
    dp->::ccc::FF3x10y14::~FF3x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y14E(Test__ZN3ccc9FF3x10y14E, "_ZN3ccc9FF3x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y14C1Ev();
extern void _ZN3ccc9FF3x10y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y14E[] = {
  NSPAIR(_ZN3ccc9FF3x10y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x10y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x10y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y14E[] = {
  {&(_ZTVN3ccc9FF3x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y14E[];
static VTBL_ENTRY alt_thunk_names895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y14E = {  "_ZN3ccc9FF3x10y14E", // class name
  bases__ZN3ccc9FF3x10y14E, 2,
  &(vtc__ZN3ccc9FF3x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names895,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x10y15  : virtual ::ccc::EE3x10 {
  ~FF3x10y15(); // tgen
  FF3x10y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x10y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2}}
}
namespace ccc { 
ccc::FF3x10y15 ::~FF3x10y15(){ note_dtor("_ZN3ccc9FF3x10y15E", this);} // tgen
ccc::FF3x10y15 ::FF3x10y15(){ note_ctor("_ZN3ccc9FF3x10y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x10y15E, buf);
    ::ccc::FF3x10y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x10y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y15E");
    check_base_class_offset(lv, (::ccc::EE3x10*), 0, "_ZN3ccc9FF3x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x10y15E);
    dp->::ccc::FF3x10y15::~FF3x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x10y15E(Test__ZN3ccc9FF3x10y15E, "_ZN3ccc9FF3x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x10y15C1Ev();
extern void _ZN3ccc9FF3x10y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x10y15E[] = {
  NSPAIR(_ZN3ccc9FF3x10y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x10E[];
static Base_Class bases__ZN3ccc9FF3x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x10y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv)();
extern void _ZN3ccc6EE3x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv)();
extern void _ZN3ccc6EE3x103abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x10y15E[] = {
  {&(_ZTVN3ccc9FF3x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x10y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x10E__NS_9FF3x10y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x10y15E[];
static VTBL_ENTRY alt_thunk_names896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x103abcEv,_ZTv0_n20_N3ccc6EE3x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x103pqrEv,_ZTv0_n16_N3ccc6EE3x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x10y15E = {  "_ZN3ccc9FF3x10y15E", // class name
  bases__ZN3ccc9FF3x10y15E, 2,
  &(vtc__ZN3ccc9FF3x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x10y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x10y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x10y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x10y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names896,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y0  : virtual ::ccc::EE3x11 {
  virtual void  abc(); // _ZN3ccc8FF3x11y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y03pqrEv
  ~FF3x11y0(); // tgen
  FF3x11y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y03abcEv");}
void  ccc::FF3x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y03efgEv");}
void  ccc::FF3x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y03pqrEv");}
ccc::FF3x11y0 ::~FF3x11y0(){ note_dtor("_ZN3ccc8FF3x11y0E", this);} // tgen
ccc::FF3x11y0 ::FF3x11y0(){ note_ctor("_ZN3ccc8FF3x11y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y0E, buf);
    ::ccc::FF3x11y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y0E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y0E);
    dp->::ccc::FF3x11y0::~FF3x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y0E(Test__ZN3ccc8FF3x11y0E, "_ZN3ccc8FF3x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y0C1Ev();
extern void _ZN3ccc8FF3x11y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y0E[] = {
  NSPAIR(_ZN3ccc8FF3x11y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y0E[];
extern void _ZN3ccc8FF3x11y03efgEv();
extern void _ZN3ccc8FF3x11y03pqrEv();
extern void _ZN3ccc8FF3x11y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y0E[] = {
  {&(_ZTVN3ccc8FF3x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y0E[];
static VTBL_ENTRY alt_thunk_names897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y0E = {  "_ZN3ccc8FF3x11y0E", // class name
  bases__ZN3ccc8FF3x11y0E, 2,
  &(vtc__ZN3ccc8FF3x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names897,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y1  : virtual ::ccc::EE3x11 {
  virtual void  abc(); // _ZN3ccc8FF3x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x11y13efgEv
  ~FF3x11y1(); // tgen
  FF3x11y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y13abcEv");}
void  ccc::FF3x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y13pqrEv");}
void  ccc::FF3x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y13efgEv");}
ccc::FF3x11y1 ::~FF3x11y1(){ note_dtor("_ZN3ccc8FF3x11y1E", this);} // tgen
ccc::FF3x11y1 ::FF3x11y1(){ note_ctor("_ZN3ccc8FF3x11y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y1E, buf);
    ::ccc::FF3x11y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y1E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y1E);
    dp->::ccc::FF3x11y1::~FF3x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y1E(Test__ZN3ccc8FF3x11y1E, "_ZN3ccc8FF3x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y1C1Ev();
extern void _ZN3ccc8FF3x11y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y1E[] = {
  NSPAIR(_ZN3ccc8FF3x11y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y1E[];
extern void _ZN3ccc8FF3x11y13efgEv();
extern void _ZN3ccc8FF3x11y13pqrEv();
extern void _ZN3ccc8FF3x11y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y1E[] = {
  {&(_ZTVN3ccc8FF3x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y1E[];
static VTBL_ENTRY alt_thunk_names898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y1E = {  "_ZN3ccc8FF3x11y1E", // class name
  bases__ZN3ccc8FF3x11y1E, 2,
  &(vtc__ZN3ccc8FF3x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names898,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y2  : virtual ::ccc::EE3x11 {
  virtual void  efg(); // _ZN3ccc8FF3x11y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y23pqrEv
  ~FF3x11y2(); // tgen
  FF3x11y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y23efgEv");}
void  ccc::FF3x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y23abcEv");}
void  ccc::FF3x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y23pqrEv");}
ccc::FF3x11y2 ::~FF3x11y2(){ note_dtor("_ZN3ccc8FF3x11y2E", this);} // tgen
ccc::FF3x11y2 ::FF3x11y2(){ note_ctor("_ZN3ccc8FF3x11y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y2E, buf);
    ::ccc::FF3x11y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y2E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y2E);
    dp->::ccc::FF3x11y2::~FF3x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y2E(Test__ZN3ccc8FF3x11y2E, "_ZN3ccc8FF3x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y2C1Ev();
extern void _ZN3ccc8FF3x11y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y2E[] = {
  NSPAIR(_ZN3ccc8FF3x11y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y2E[];
extern void _ZN3ccc8FF3x11y23efgEv();
extern void _ZN3ccc8FF3x11y23pqrEv();
extern void _ZN3ccc8FF3x11y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y2E[] = {
  {&(_ZTVN3ccc8FF3x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y2E[];
static VTBL_ENTRY alt_thunk_names899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y2E = {  "_ZN3ccc8FF3x11y2E", // class name
  bases__ZN3ccc8FF3x11y2E, 2,
  &(vtc__ZN3ccc8FF3x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names899,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y3  : virtual ::ccc::EE3x11 {
  virtual void  efg(); // _ZN3ccc8FF3x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x11y33abcEv
  ~FF3x11y3(); // tgen
  FF3x11y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y33efgEv");}
void  ccc::FF3x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y33pqrEv");}
void  ccc::FF3x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y33abcEv");}
ccc::FF3x11y3 ::~FF3x11y3(){ note_dtor("_ZN3ccc8FF3x11y3E", this);} // tgen
ccc::FF3x11y3 ::FF3x11y3(){ note_ctor("_ZN3ccc8FF3x11y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y3E, buf);
    ::ccc::FF3x11y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y3E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y3E);
    dp->::ccc::FF3x11y3::~FF3x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y3E(Test__ZN3ccc8FF3x11y3E, "_ZN3ccc8FF3x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y3C1Ev();
extern void _ZN3ccc8FF3x11y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y3E[] = {
  NSPAIR(_ZN3ccc8FF3x11y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y3E[];
extern void _ZN3ccc8FF3x11y33efgEv();
extern void _ZN3ccc8FF3x11y33pqrEv();
extern void _ZN3ccc8FF3x11y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y3E[] = {
  {&(_ZTVN3ccc8FF3x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y3E[];
static VTBL_ENTRY alt_thunk_names900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y3E = {  "_ZN3ccc8FF3x11y3E", // class name
  bases__ZN3ccc8FF3x11y3E, 2,
  &(vtc__ZN3ccc8FF3x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names900,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y4  : virtual ::ccc::EE3x11 {
  virtual void  pqr(); // _ZN3ccc8FF3x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x11y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x11y43efgEv
  ~FF3x11y4(); // tgen
  FF3x11y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y43pqrEv");}
void  ccc::FF3x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y43abcEv");}
void  ccc::FF3x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y43efgEv");}
ccc::FF3x11y4 ::~FF3x11y4(){ note_dtor("_ZN3ccc8FF3x11y4E", this);} // tgen
ccc::FF3x11y4 ::FF3x11y4(){ note_ctor("_ZN3ccc8FF3x11y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y4E, buf);
    ::ccc::FF3x11y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y4E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y4E);
    dp->::ccc::FF3x11y4::~FF3x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y4E(Test__ZN3ccc8FF3x11y4E, "_ZN3ccc8FF3x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y4C1Ev();
extern void _ZN3ccc8FF3x11y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y4E[] = {
  NSPAIR(_ZN3ccc8FF3x11y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y4E[];
extern void _ZN3ccc8FF3x11y43efgEv();
extern void _ZN3ccc8FF3x11y43pqrEv();
extern void _ZN3ccc8FF3x11y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y4E[] = {
  {&(_ZTVN3ccc8FF3x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y4E[];
static VTBL_ENTRY alt_thunk_names901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y4E = {  "_ZN3ccc8FF3x11y4E", // class name
  bases__ZN3ccc8FF3x11y4E, 2,
  &(vtc__ZN3ccc8FF3x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names901,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y5  : virtual ::ccc::EE3x11 {
  virtual void  pqr(); // _ZN3ccc8FF3x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x11y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x11y53abcEv
  ~FF3x11y5(); // tgen
  FF3x11y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y53pqrEv");}
void  ccc::FF3x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y53efgEv");}
void  ccc::FF3x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y53abcEv");}
ccc::FF3x11y5 ::~FF3x11y5(){ note_dtor("_ZN3ccc8FF3x11y5E", this);} // tgen
ccc::FF3x11y5 ::FF3x11y5(){ note_ctor("_ZN3ccc8FF3x11y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y5E, buf);
    ::ccc::FF3x11y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y5E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y5E);
    dp->::ccc::FF3x11y5::~FF3x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y5E(Test__ZN3ccc8FF3x11y5E, "_ZN3ccc8FF3x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y5C1Ev();
extern void _ZN3ccc8FF3x11y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y5E[] = {
  NSPAIR(_ZN3ccc8FF3x11y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y5E[];
extern void _ZN3ccc8FF3x11y53efgEv();
extern void _ZN3ccc8FF3x11y53pqrEv();
extern void _ZN3ccc8FF3x11y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y5E[] = {
  {&(_ZTVN3ccc8FF3x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y5E[];
static VTBL_ENTRY alt_thunk_names902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y5E = {  "_ZN3ccc8FF3x11y5E", // class name
  bases__ZN3ccc8FF3x11y5E, 2,
  &(vtc__ZN3ccc8FF3x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names902,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y6  : virtual ::ccc::EE3x11 {
  virtual void  abc(); // _ZN3ccc8FF3x11y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x11y63efgEv
  ~FF3x11y6(); // tgen
  FF3x11y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y63abcEv");}
void  ccc::FF3x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y63efgEv");}
ccc::FF3x11y6 ::~FF3x11y6(){ note_dtor("_ZN3ccc8FF3x11y6E", this);} // tgen
ccc::FF3x11y6 ::FF3x11y6(){ note_ctor("_ZN3ccc8FF3x11y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y6E, buf);
    ::ccc::FF3x11y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y6E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y6E);
    dp->::ccc::FF3x11y6::~FF3x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y6E(Test__ZN3ccc8FF3x11y6E, "_ZN3ccc8FF3x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y6C1Ev();
extern void _ZN3ccc8FF3x11y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y6E[] = {
  NSPAIR(_ZN3ccc8FF3x11y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y6E[];
extern void _ZN3ccc8FF3x11y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x11y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y6E[] = {
  {&(_ZTVN3ccc8FF3x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y6E[];
static VTBL_ENTRY alt_thunk_names903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y6E = {  "_ZN3ccc8FF3x11y6E", // class name
  bases__ZN3ccc8FF3x11y6E, 2,
  &(vtc__ZN3ccc8FF3x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names903,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y7  : virtual ::ccc::EE3x11 {
  virtual void  abc(); // _ZN3ccc8FF3x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y73pqrEv
  ~FF3x11y7(); // tgen
  FF3x11y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y73abcEv");}
void  ccc::FF3x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y73pqrEv");}
ccc::FF3x11y7 ::~FF3x11y7(){ note_dtor("_ZN3ccc8FF3x11y7E", this);} // tgen
ccc::FF3x11y7 ::FF3x11y7(){ note_ctor("_ZN3ccc8FF3x11y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y7E, buf);
    ::ccc::FF3x11y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y7E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y7E);
    dp->::ccc::FF3x11y7::~FF3x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y7E(Test__ZN3ccc8FF3x11y7E, "_ZN3ccc8FF3x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y7C1Ev();
extern void _ZN3ccc8FF3x11y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y7E[] = {
  NSPAIR(_ZN3ccc8FF3x11y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x11y73pqrEv();
extern void _ZN3ccc8FF3x11y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y7E[] = {
  {&(_ZTVN3ccc8FF3x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y7E[];
static VTBL_ENTRY alt_thunk_names904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y7E = {  "_ZN3ccc8FF3x11y7E", // class name
  bases__ZN3ccc8FF3x11y7E, 2,
  &(vtc__ZN3ccc8FF3x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names904,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y8  : virtual ::ccc::EE3x11 {
  virtual void  efg(); // _ZN3ccc8FF3x11y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x11y83abcEv
  ~FF3x11y8(); // tgen
  FF3x11y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y83efgEv");}
void  ccc::FF3x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x11y83abcEv");}
ccc::FF3x11y8 ::~FF3x11y8(){ note_dtor("_ZN3ccc8FF3x11y8E", this);} // tgen
ccc::FF3x11y8 ::FF3x11y8(){ note_ctor("_ZN3ccc8FF3x11y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y8E, buf);
    ::ccc::FF3x11y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y8E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y8E);
    dp->::ccc::FF3x11y8::~FF3x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y8E(Test__ZN3ccc8FF3x11y8E, "_ZN3ccc8FF3x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y8C1Ev();
extern void _ZN3ccc8FF3x11y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y8E[] = {
  NSPAIR(_ZN3ccc8FF3x11y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y8E[];
extern void _ZN3ccc8FF3x11y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x11y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y8E[] = {
  {&(_ZTVN3ccc8FF3x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y8E[];
static VTBL_ENTRY alt_thunk_names905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y8E = {  "_ZN3ccc8FF3x11y8E", // class name
  bases__ZN3ccc8FF3x11y8E, 2,
  &(vtc__ZN3ccc8FF3x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names905,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y9  : virtual ::ccc::EE3x11 {
  virtual void  efg(); // _ZN3ccc8FF3x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x11y93pqrEv
  ~FF3x11y9(); // tgen
  FF3x11y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x11y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x11y93efgEv");}
void  ccc::FF3x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x11y93pqrEv");}
ccc::FF3x11y9 ::~FF3x11y9(){ note_dtor("_ZN3ccc8FF3x11y9E", this);} // tgen
ccc::FF3x11y9 ::FF3x11y9(){ note_ctor("_ZN3ccc8FF3x11y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x11y9E, buf);
    ::ccc::FF3x11y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x11y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y9E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc8FF3x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x11y9E);
    dp->::ccc::FF3x11y9::~FF3x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x11y9E(Test__ZN3ccc8FF3x11y9E, "_ZN3ccc8FF3x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x11y9C1Ev();
extern void _ZN3ccc8FF3x11y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x11y9E[] = {
  NSPAIR(_ZN3ccc8FF3x11y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc8FF3x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y9E[];
extern void _ZN3ccc8FF3x11y93efgEv();
extern void _ZN3ccc8FF3x11y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x11y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x11y9E[] = {
  {&(_ZTVN3ccc8FF3x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x11y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_8FF3x11y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x11y9E[];
static VTBL_ENTRY alt_thunk_names906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x11y9E = {  "_ZN3ccc8FF3x11y9E", // class name
  bases__ZN3ccc8FF3x11y9E, 2,
  &(vtc__ZN3ccc8FF3x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x11y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x11y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x11y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x11y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names906,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y10  : virtual ::ccc::EE3x11 {
  virtual void  pqr(); // _ZN3ccc9FF3x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x11y103abcEv
  ~FF3x11y10(); // tgen
  FF3x11y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x11y103pqrEv");}
void  ccc::FF3x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x11y103abcEv");}
ccc::FF3x11y10 ::~FF3x11y10(){ note_dtor("_ZN3ccc9FF3x11y10E", this);} // tgen
ccc::FF3x11y10 ::FF3x11y10(){ note_ctor("_ZN3ccc9FF3x11y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y10E, buf);
    ::ccc::FF3x11y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y10E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y10E);
    dp->::ccc::FF3x11y10::~FF3x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y10E(Test__ZN3ccc9FF3x11y10E, "_ZN3ccc9FF3x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y10C1Ev();
extern void _ZN3ccc9FF3x11y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y10E[] = {
  NSPAIR(_ZN3ccc9FF3x11y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF3x11y103pqrEv();
extern void _ZN3ccc9FF3x11y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y10E[] = {
  {&(_ZTVN3ccc9FF3x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y10E[];
static VTBL_ENTRY alt_thunk_names907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y10E = {  "_ZN3ccc9FF3x11y10E", // class name
  bases__ZN3ccc9FF3x11y10E, 2,
  &(vtc__ZN3ccc9FF3x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names907,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y11  : virtual ::ccc::EE3x11 {
  virtual void  pqr(); // _ZN3ccc9FF3x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x11y113efgEv
  ~FF3x11y11(); // tgen
  FF3x11y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x11y113pqrEv");}
void  ccc::FF3x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x11y113efgEv");}
ccc::FF3x11y11 ::~FF3x11y11(){ note_dtor("_ZN3ccc9FF3x11y11E", this);} // tgen
ccc::FF3x11y11 ::FF3x11y11(){ note_ctor("_ZN3ccc9FF3x11y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y11E, buf);
    ::ccc::FF3x11y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y11E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y11E);
    dp->::ccc::FF3x11y11::~FF3x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y11E(Test__ZN3ccc9FF3x11y11E, "_ZN3ccc9FF3x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y11C1Ev();
extern void _ZN3ccc9FF3x11y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y11E[] = {
  NSPAIR(_ZN3ccc9FF3x11y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y11E[];
extern void _ZN3ccc9FF3x11y113efgEv();
extern void _ZN3ccc9FF3x11y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y11E[] = {
  {&(_ZTVN3ccc9FF3x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y11E[];
static VTBL_ENTRY alt_thunk_names908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y11E = {  "_ZN3ccc9FF3x11y11E", // class name
  bases__ZN3ccc9FF3x11y11E, 2,
  &(vtc__ZN3ccc9FF3x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names908,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y12  : virtual ::ccc::EE3x11 {
  virtual void  abc(); // _ZN3ccc9FF3x11y123abcEv
  ~FF3x11y12(); // tgen
  FF3x11y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF3x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x11y123abcEv");}
ccc::FF3x11y12 ::~FF3x11y12(){ note_dtor("_ZN3ccc9FF3x11y12E", this);} // tgen
ccc::FF3x11y12 ::FF3x11y12(){ note_ctor("_ZN3ccc9FF3x11y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y12E, buf);
    ::ccc::FF3x11y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y12E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y12E);
    dp->::ccc::FF3x11y12::~FF3x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y12E(Test__ZN3ccc9FF3x11y12E, "_ZN3ccc9FF3x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y12C1Ev();
extern void _ZN3ccc9FF3x11y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y12E[] = {
  NSPAIR(_ZN3ccc9FF3x11y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF3x11y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y12E[] = {
  {&(_ZTVN3ccc9FF3x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y12E[];
static VTBL_ENTRY alt_thunk_names909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y12E = {  "_ZN3ccc9FF3x11y12E", // class name
  bases__ZN3ccc9FF3x11y12E, 2,
  &(vtc__ZN3ccc9FF3x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names909,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y13  : virtual ::ccc::EE3x11 {
  virtual void  efg(); // _ZN3ccc9FF3x11y133efgEv
  ~FF3x11y13(); // tgen
  FF3x11y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF3x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x11y133efgEv");}
ccc::FF3x11y13 ::~FF3x11y13(){ note_dtor("_ZN3ccc9FF3x11y13E", this);} // tgen
ccc::FF3x11y13 ::FF3x11y13(){ note_ctor("_ZN3ccc9FF3x11y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y13E, buf);
    ::ccc::FF3x11y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y13E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y13E);
    dp->::ccc::FF3x11y13::~FF3x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y13E(Test__ZN3ccc9FF3x11y13E, "_ZN3ccc9FF3x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y13C1Ev();
extern void _ZN3ccc9FF3x11y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y13E[] = {
  NSPAIR(_ZN3ccc9FF3x11y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y13E[];
extern void _ZN3ccc9FF3x11y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y13E[] = {
  {&(_ZTVN3ccc9FF3x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y13E[];
static VTBL_ENTRY alt_thunk_names910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y13E = {  "_ZN3ccc9FF3x11y13E", // class name
  bases__ZN3ccc9FF3x11y13E, 2,
  &(vtc__ZN3ccc9FF3x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names910,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y14  : virtual ::ccc::EE3x11 {
  virtual void  pqr(); // _ZN3ccc9FF3x11y143pqrEv
  ~FF3x11y14(); // tgen
  FF3x11y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF3x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x11y143pqrEv");}
ccc::FF3x11y14 ::~FF3x11y14(){ note_dtor("_ZN3ccc9FF3x11y14E", this);} // tgen
ccc::FF3x11y14 ::FF3x11y14(){ note_ctor("_ZN3ccc9FF3x11y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y14E, buf);
    ::ccc::FF3x11y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y14E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y14E);
    dp->::ccc::FF3x11y14::~FF3x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y14E(Test__ZN3ccc9FF3x11y14E, "_ZN3ccc9FF3x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y14C1Ev();
extern void _ZN3ccc9FF3x11y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y14E[] = {
  NSPAIR(_ZN3ccc9FF3x11y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void _ZN3ccc9FF3x11y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y14E[] = {
  {&(_ZTVN3ccc9FF3x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y14E[];
static VTBL_ENTRY alt_thunk_names911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y14E = {  "_ZN3ccc9FF3x11y14E", // class name
  bases__ZN3ccc9FF3x11y14E, 2,
  &(vtc__ZN3ccc9FF3x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names911,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x11y15  : virtual ::ccc::EE3x11 {
  ~FF3x11y15(); // tgen
  FF3x11y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x11y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2}}
}
namespace ccc { 
ccc::FF3x11y15 ::~FF3x11y15(){ note_dtor("_ZN3ccc9FF3x11y15E", this);} // tgen
ccc::FF3x11y15 ::FF3x11y15(){ note_ctor("_ZN3ccc9FF3x11y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x11y15E, buf);
    ::ccc::FF3x11y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x11y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y15E");
    check_base_class_offset(lv, (::ccc::EE3x11*), 0, "_ZN3ccc9FF3x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x11y15E);
    dp->::ccc::FF3x11y15::~FF3x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x11y15E(Test__ZN3ccc9FF3x11y15E, "_ZN3ccc9FF3x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x11y15C1Ev();
extern void _ZN3ccc9FF3x11y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x11y15E[] = {
  NSPAIR(_ZN3ccc9FF3x11y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x11E[];
static Base_Class bases__ZN3ccc9FF3x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x11y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv)();
extern void _ZN3ccc6EE3x113efgEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv)();
extern void _ZN3ccc6EE3x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x11y15E[] = {
  {&(_ZTVN3ccc9FF3x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x11y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x11E__NS_9FF3x11y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x11y15E[];
static VTBL_ENTRY alt_thunk_names912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x113pqrEv,_ZTv0_n16_N3ccc6EE3x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x113efgEv,_ZTv0_n12_N3ccc6EE3x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x11y15E = {  "_ZN3ccc9FF3x11y15E", // class name
  bases__ZN3ccc9FF3x11y15E, 2,
  &(vtc__ZN3ccc9FF3x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x11y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x11y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x11y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x11y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names912,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y0  : virtual ::ccc::EE3x12 {
  virtual void  abc(); // _ZN3ccc8FF3x12y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y03pqrEv
  ~FF3x12y0(); // tgen
  FF3x12y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y03abcEv");}
void  ccc::FF3x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y03efgEv");}
void  ccc::FF3x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y03pqrEv");}
ccc::FF3x12y0 ::~FF3x12y0(){ note_dtor("_ZN3ccc8FF3x12y0E", this);} // tgen
ccc::FF3x12y0 ::FF3x12y0(){ note_ctor("_ZN3ccc8FF3x12y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y0E, buf);
    ::ccc::FF3x12y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y0E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y0E);
    dp->::ccc::FF3x12y0::~FF3x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y0E(Test__ZN3ccc8FF3x12y0E, "_ZN3ccc8FF3x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y0C1Ev();
extern void _ZN3ccc8FF3x12y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y0E[] = {
  NSPAIR(_ZN3ccc8FF3x12y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y0E[];
extern void _ZN3ccc8FF3x12y03efgEv();
extern void _ZN3ccc8FF3x12y03pqrEv();
extern void _ZN3ccc8FF3x12y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y0E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y0E[] = {
  {&(_ZTVN3ccc8FF3x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y0E[];
static VTBL_ENTRY alt_thunk_names913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y0E = {  "_ZN3ccc8FF3x12y0E", // class name
  bases__ZN3ccc8FF3x12y0E, 2,
  &(vtc__ZN3ccc8FF3x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names913,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y1  : virtual ::ccc::EE3x12 {
  virtual void  abc(); // _ZN3ccc8FF3x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x12y13efgEv
  ~FF3x12y1(); // tgen
  FF3x12y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y13abcEv");}
void  ccc::FF3x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y13pqrEv");}
void  ccc::FF3x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y13efgEv");}
ccc::FF3x12y1 ::~FF3x12y1(){ note_dtor("_ZN3ccc8FF3x12y1E", this);} // tgen
ccc::FF3x12y1 ::FF3x12y1(){ note_ctor("_ZN3ccc8FF3x12y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y1E, buf);
    ::ccc::FF3x12y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y1E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y1E);
    dp->::ccc::FF3x12y1::~FF3x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y1E(Test__ZN3ccc8FF3x12y1E, "_ZN3ccc8FF3x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y1C1Ev();
extern void _ZN3ccc8FF3x12y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y1E[] = {
  NSPAIR(_ZN3ccc8FF3x12y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y1E[];
extern void _ZN3ccc8FF3x12y13efgEv();
extern void _ZN3ccc8FF3x12y13pqrEv();
extern void _ZN3ccc8FF3x12y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y1E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y1E[] = {
  {&(_ZTVN3ccc8FF3x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y1E[];
static VTBL_ENTRY alt_thunk_names914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y1E = {  "_ZN3ccc8FF3x12y1E", // class name
  bases__ZN3ccc8FF3x12y1E, 2,
  &(vtc__ZN3ccc8FF3x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names914,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y2  : virtual ::ccc::EE3x12 {
  virtual void  efg(); // _ZN3ccc8FF3x12y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y23pqrEv
  ~FF3x12y2(); // tgen
  FF3x12y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y23efgEv");}
void  ccc::FF3x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y23abcEv");}
void  ccc::FF3x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y23pqrEv");}
ccc::FF3x12y2 ::~FF3x12y2(){ note_dtor("_ZN3ccc8FF3x12y2E", this);} // tgen
ccc::FF3x12y2 ::FF3x12y2(){ note_ctor("_ZN3ccc8FF3x12y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y2E, buf);
    ::ccc::FF3x12y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y2E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y2E);
    dp->::ccc::FF3x12y2::~FF3x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y2E(Test__ZN3ccc8FF3x12y2E, "_ZN3ccc8FF3x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y2C1Ev();
extern void _ZN3ccc8FF3x12y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y2E[] = {
  NSPAIR(_ZN3ccc8FF3x12y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y2E[];
extern void _ZN3ccc8FF3x12y23efgEv();
extern void _ZN3ccc8FF3x12y23pqrEv();
extern void _ZN3ccc8FF3x12y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y2E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y2E[] = {
  {&(_ZTVN3ccc8FF3x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y2E[];
static VTBL_ENTRY alt_thunk_names915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y2E = {  "_ZN3ccc8FF3x12y2E", // class name
  bases__ZN3ccc8FF3x12y2E, 2,
  &(vtc__ZN3ccc8FF3x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names915,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y3  : virtual ::ccc::EE3x12 {
  virtual void  efg(); // _ZN3ccc8FF3x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x12y33abcEv
  ~FF3x12y3(); // tgen
  FF3x12y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y33efgEv");}
void  ccc::FF3x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y33pqrEv");}
void  ccc::FF3x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y33abcEv");}
ccc::FF3x12y3 ::~FF3x12y3(){ note_dtor("_ZN3ccc8FF3x12y3E", this);} // tgen
ccc::FF3x12y3 ::FF3x12y3(){ note_ctor("_ZN3ccc8FF3x12y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y3E, buf);
    ::ccc::FF3x12y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y3E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y3E);
    dp->::ccc::FF3x12y3::~FF3x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y3E(Test__ZN3ccc8FF3x12y3E, "_ZN3ccc8FF3x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y3C1Ev();
extern void _ZN3ccc8FF3x12y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y3E[] = {
  NSPAIR(_ZN3ccc8FF3x12y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y3E[];
extern void _ZN3ccc8FF3x12y33efgEv();
extern void _ZN3ccc8FF3x12y33pqrEv();
extern void _ZN3ccc8FF3x12y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y3E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y3E[] = {
  {&(_ZTVN3ccc8FF3x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y3E[];
static VTBL_ENTRY alt_thunk_names916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y3E = {  "_ZN3ccc8FF3x12y3E", // class name
  bases__ZN3ccc8FF3x12y3E, 2,
  &(vtc__ZN3ccc8FF3x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names916,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y4  : virtual ::ccc::EE3x12 {
  virtual void  pqr(); // _ZN3ccc8FF3x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x12y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x12y43efgEv
  ~FF3x12y4(); // tgen
  FF3x12y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y43pqrEv");}
void  ccc::FF3x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y43abcEv");}
void  ccc::FF3x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y43efgEv");}
ccc::FF3x12y4 ::~FF3x12y4(){ note_dtor("_ZN3ccc8FF3x12y4E", this);} // tgen
ccc::FF3x12y4 ::FF3x12y4(){ note_ctor("_ZN3ccc8FF3x12y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y4E, buf);
    ::ccc::FF3x12y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y4E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y4E);
    dp->::ccc::FF3x12y4::~FF3x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y4E(Test__ZN3ccc8FF3x12y4E, "_ZN3ccc8FF3x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y4C1Ev();
extern void _ZN3ccc8FF3x12y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y4E[] = {
  NSPAIR(_ZN3ccc8FF3x12y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y4E[];
extern void _ZN3ccc8FF3x12y43efgEv();
extern void _ZN3ccc8FF3x12y43pqrEv();
extern void _ZN3ccc8FF3x12y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y4E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y4E[] = {
  {&(_ZTVN3ccc8FF3x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y4E[];
static VTBL_ENTRY alt_thunk_names917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y4E = {  "_ZN3ccc8FF3x12y4E", // class name
  bases__ZN3ccc8FF3x12y4E, 2,
  &(vtc__ZN3ccc8FF3x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names917,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y5  : virtual ::ccc::EE3x12 {
  virtual void  pqr(); // _ZN3ccc8FF3x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x12y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x12y53abcEv
  ~FF3x12y5(); // tgen
  FF3x12y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y53pqrEv");}
void  ccc::FF3x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y53efgEv");}
void  ccc::FF3x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y53abcEv");}
ccc::FF3x12y5 ::~FF3x12y5(){ note_dtor("_ZN3ccc8FF3x12y5E", this);} // tgen
ccc::FF3x12y5 ::FF3x12y5(){ note_ctor("_ZN3ccc8FF3x12y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y5E, buf);
    ::ccc::FF3x12y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y5E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y5E);
    dp->::ccc::FF3x12y5::~FF3x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y5E(Test__ZN3ccc8FF3x12y5E, "_ZN3ccc8FF3x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y5C1Ev();
extern void _ZN3ccc8FF3x12y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y5E[] = {
  NSPAIR(_ZN3ccc8FF3x12y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y5E[];
extern void _ZN3ccc8FF3x12y53efgEv();
extern void _ZN3ccc8FF3x12y53pqrEv();
extern void _ZN3ccc8FF3x12y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y5E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y5E[] = {
  {&(_ZTVN3ccc8FF3x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y5E[];
static VTBL_ENTRY alt_thunk_names918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y5E = {  "_ZN3ccc8FF3x12y5E", // class name
  bases__ZN3ccc8FF3x12y5E, 2,
  &(vtc__ZN3ccc8FF3x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names918,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y6  : virtual ::ccc::EE3x12 {
  virtual void  abc(); // _ZN3ccc8FF3x12y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x12y63efgEv
  ~FF3x12y6(); // tgen
  FF3x12y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y63abcEv");}
void  ccc::FF3x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y63efgEv");}
ccc::FF3x12y6 ::~FF3x12y6(){ note_dtor("_ZN3ccc8FF3x12y6E", this);} // tgen
ccc::FF3x12y6 ::FF3x12y6(){ note_ctor("_ZN3ccc8FF3x12y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y6E, buf);
    ::ccc::FF3x12y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y6E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y6E);
    dp->::ccc::FF3x12y6::~FF3x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y6E(Test__ZN3ccc8FF3x12y6E, "_ZN3ccc8FF3x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y6C1Ev();
extern void _ZN3ccc8FF3x12y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y6E[] = {
  NSPAIR(_ZN3ccc8FF3x12y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y6E[];
extern void _ZN3ccc8FF3x12y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x12y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y6E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y6E[] = {
  {&(_ZTVN3ccc8FF3x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y6E[];
static VTBL_ENTRY alt_thunk_names919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y6E = {  "_ZN3ccc8FF3x12y6E", // class name
  bases__ZN3ccc8FF3x12y6E, 2,
  &(vtc__ZN3ccc8FF3x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names919,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y7  : virtual ::ccc::EE3x12 {
  virtual void  abc(); // _ZN3ccc8FF3x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y73pqrEv
  ~FF3x12y7(); // tgen
  FF3x12y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y73abcEv");}
void  ccc::FF3x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y73pqrEv");}
ccc::FF3x12y7 ::~FF3x12y7(){ note_dtor("_ZN3ccc8FF3x12y7E", this);} // tgen
ccc::FF3x12y7 ::FF3x12y7(){ note_ctor("_ZN3ccc8FF3x12y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y7E, buf);
    ::ccc::FF3x12y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y7E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y7E);
    dp->::ccc::FF3x12y7::~FF3x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y7E(Test__ZN3ccc8FF3x12y7E, "_ZN3ccc8FF3x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y7C1Ev();
extern void _ZN3ccc8FF3x12y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y7E[] = {
  NSPAIR(_ZN3ccc8FF3x12y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x12y73pqrEv();
extern void _ZN3ccc8FF3x12y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y7E[] = {
  {&(_ZTVN3ccc8FF3x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y7E[];
static VTBL_ENTRY alt_thunk_names920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y7E = {  "_ZN3ccc8FF3x12y7E", // class name
  bases__ZN3ccc8FF3x12y7E, 2,
  &(vtc__ZN3ccc8FF3x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names920,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y8  : virtual ::ccc::EE3x12 {
  virtual void  efg(); // _ZN3ccc8FF3x12y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x12y83abcEv
  ~FF3x12y8(); // tgen
  FF3x12y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y83efgEv");}
void  ccc::FF3x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x12y83abcEv");}
ccc::FF3x12y8 ::~FF3x12y8(){ note_dtor("_ZN3ccc8FF3x12y8E", this);} // tgen
ccc::FF3x12y8 ::FF3x12y8(){ note_ctor("_ZN3ccc8FF3x12y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y8E, buf);
    ::ccc::FF3x12y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y8E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y8E);
    dp->::ccc::FF3x12y8::~FF3x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y8E(Test__ZN3ccc8FF3x12y8E, "_ZN3ccc8FF3x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y8C1Ev();
extern void _ZN3ccc8FF3x12y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y8E[] = {
  NSPAIR(_ZN3ccc8FF3x12y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y8E[];
extern void _ZN3ccc8FF3x12y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x12y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y8E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y8E[] = {
  {&(_ZTVN3ccc8FF3x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y8E[];
static VTBL_ENTRY alt_thunk_names921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y8E = {  "_ZN3ccc8FF3x12y8E", // class name
  bases__ZN3ccc8FF3x12y8E, 2,
  &(vtc__ZN3ccc8FF3x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names921,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y9  : virtual ::ccc::EE3x12 {
  virtual void  efg(); // _ZN3ccc8FF3x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x12y93pqrEv
  ~FF3x12y9(); // tgen
  FF3x12y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x12y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x12y93efgEv");}
void  ccc::FF3x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x12y93pqrEv");}
ccc::FF3x12y9 ::~FF3x12y9(){ note_dtor("_ZN3ccc8FF3x12y9E", this);} // tgen
ccc::FF3x12y9 ::FF3x12y9(){ note_ctor("_ZN3ccc8FF3x12y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x12y9E, buf);
    ::ccc::FF3x12y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x12y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y9E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc8FF3x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x12y9E);
    dp->::ccc::FF3x12y9::~FF3x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x12y9E(Test__ZN3ccc8FF3x12y9E, "_ZN3ccc8FF3x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x12y9C1Ev();
extern void _ZN3ccc8FF3x12y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x12y9E[] = {
  NSPAIR(_ZN3ccc8FF3x12y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc8FF3x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y9E[];
extern void _ZN3ccc8FF3x12y93efgEv();
extern void _ZN3ccc8FF3x12y93pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF3x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x12y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x12y9E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x12y9E[] = {
  {&(_ZTVN3ccc8FF3x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x12y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_8FF3x12y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x12y9E[];
static VTBL_ENTRY alt_thunk_names922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x12y9E = {  "_ZN3ccc8FF3x12y9E", // class name
  bases__ZN3ccc8FF3x12y9E, 2,
  &(vtc__ZN3ccc8FF3x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x12y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x12y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x12y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x12y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names922,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y10  : virtual ::ccc::EE3x12 {
  virtual void  pqr(); // _ZN3ccc9FF3x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x12y103abcEv
  ~FF3x12y10(); // tgen
  FF3x12y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x12y103pqrEv");}
void  ccc::FF3x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x12y103abcEv");}
ccc::FF3x12y10 ::~FF3x12y10(){ note_dtor("_ZN3ccc9FF3x12y10E", this);} // tgen
ccc::FF3x12y10 ::FF3x12y10(){ note_ctor("_ZN3ccc9FF3x12y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y10E, buf);
    ::ccc::FF3x12y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y10E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y10E);
    dp->::ccc::FF3x12y10::~FF3x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y10E(Test__ZN3ccc9FF3x12y10E, "_ZN3ccc9FF3x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y10C1Ev();
extern void _ZN3ccc9FF3x12y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y10E[] = {
  NSPAIR(_ZN3ccc9FF3x12y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x12y103pqrEv();
extern void _ZN3ccc9FF3x12y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y10E[] = {
  {&(_ZTVN3ccc9FF3x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y10E[];
static VTBL_ENTRY alt_thunk_names923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y10E = {  "_ZN3ccc9FF3x12y10E", // class name
  bases__ZN3ccc9FF3x12y10E, 2,
  &(vtc__ZN3ccc9FF3x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names923,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y11  : virtual ::ccc::EE3x12 {
  virtual void  pqr(); // _ZN3ccc9FF3x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x12y113efgEv
  ~FF3x12y11(); // tgen
  FF3x12y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x12y113pqrEv");}
void  ccc::FF3x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x12y113efgEv");}
ccc::FF3x12y11 ::~FF3x12y11(){ note_dtor("_ZN3ccc9FF3x12y11E", this);} // tgen
ccc::FF3x12y11 ::FF3x12y11(){ note_ctor("_ZN3ccc9FF3x12y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y11E, buf);
    ::ccc::FF3x12y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y11E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y11E);
    dp->::ccc::FF3x12y11::~FF3x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y11E(Test__ZN3ccc9FF3x12y11E, "_ZN3ccc9FF3x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y11C1Ev();
extern void _ZN3ccc9FF3x12y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y11E[] = {
  NSPAIR(_ZN3ccc9FF3x12y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y11E[];
extern void _ZN3ccc9FF3x12y113efgEv();
extern void _ZN3ccc9FF3x12y113pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y11E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y11E[] = {
  {&(_ZTVN3ccc9FF3x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y11E[];
static VTBL_ENTRY alt_thunk_names924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y11E = {  "_ZN3ccc9FF3x12y11E", // class name
  bases__ZN3ccc9FF3x12y11E, 2,
  &(vtc__ZN3ccc9FF3x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names924,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y12  : virtual ::ccc::EE3x12 {
  virtual void  abc(); // _ZN3ccc9FF3x12y123abcEv
  ~FF3x12y12(); // tgen
  FF3x12y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1}
}
namespace ccc { 
void  ccc::FF3x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x12y123abcEv");}
ccc::FF3x12y12 ::~FF3x12y12(){ note_dtor("_ZN3ccc9FF3x12y12E", this);} // tgen
ccc::FF3x12y12 ::FF3x12y12(){ note_ctor("_ZN3ccc9FF3x12y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y12E, buf);
    ::ccc::FF3x12y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y12E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y12E);
    dp->::ccc::FF3x12y12::~FF3x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y12E(Test__ZN3ccc9FF3x12y12E, "_ZN3ccc9FF3x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y12C1Ev();
extern void _ZN3ccc9FF3x12y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y12E[] = {
  NSPAIR(_ZN3ccc9FF3x12y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9FF3x12y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y12E[] = {
  {&(_ZTVN3ccc9FF3x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y12E[];
static VTBL_ENTRY alt_thunk_names925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y12E = {  "_ZN3ccc9FF3x12y12E", // class name
  bases__ZN3ccc9FF3x12y12E, 2,
  &(vtc__ZN3ccc9FF3x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names925,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y13  : virtual ::ccc::EE3x12 {
  virtual void  efg(); // _ZN3ccc9FF3x12y133efgEv
  ~FF3x12y13(); // tgen
  FF3x12y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y13E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF3x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x12y133efgEv");}
ccc::FF3x12y13 ::~FF3x12y13(){ note_dtor("_ZN3ccc9FF3x12y13E", this);} // tgen
ccc::FF3x12y13 ::FF3x12y13(){ note_ctor("_ZN3ccc9FF3x12y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y13E, buf);
    ::ccc::FF3x12y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y13E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y13E);
    dp->::ccc::FF3x12y13::~FF3x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y13E(Test__ZN3ccc9FF3x12y13E, "_ZN3ccc9FF3x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y13C1Ev();
extern void _ZN3ccc9FF3x12y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y13E[] = {
  NSPAIR(_ZN3ccc9FF3x12y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y13E[];
extern void _ZN3ccc9FF3x12y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y13E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y13E[] = {
  {&(_ZTVN3ccc9FF3x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y13E[];
static VTBL_ENTRY alt_thunk_names926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y13E = {  "_ZN3ccc9FF3x12y13E", // class name
  bases__ZN3ccc9FF3x12y13E, 2,
  &(vtc__ZN3ccc9FF3x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names926,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y14  : virtual ::ccc::EE3x12 {
  virtual void  pqr(); // _ZN3ccc9FF3x12y143pqrEv
  ~FF3x12y14(); // tgen
  FF3x12y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y14E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF3x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x12y143pqrEv");}
ccc::FF3x12y14 ::~FF3x12y14(){ note_dtor("_ZN3ccc9FF3x12y14E", this);} // tgen
ccc::FF3x12y14 ::FF3x12y14(){ note_ctor("_ZN3ccc9FF3x12y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y14E, buf);
    ::ccc::FF3x12y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y14E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y14E);
    dp->::ccc::FF3x12y14::~FF3x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y14E(Test__ZN3ccc9FF3x12y14E, "_ZN3ccc9FF3x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y14C1Ev();
extern void _ZN3ccc9FF3x12y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y14E[] = {
  NSPAIR(_ZN3ccc9FF3x12y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x12y143pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x12y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y14E[] = {
  {&(_ZTVN3ccc9FF3x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y14E[];
static VTBL_ENTRY alt_thunk_names927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y14E = {  "_ZN3ccc9FF3x12y14E", // class name
  bases__ZN3ccc9FF3x12y14E, 2,
  &(vtc__ZN3ccc9FF3x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names927,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x12y15  : virtual ::ccc::EE3x12 {
  ~FF3x12y15(); // tgen
  FF3x12y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x12y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1}}
}
namespace ccc { 
ccc::FF3x12y15 ::~FF3x12y15(){ note_dtor("_ZN3ccc9FF3x12y15E", this);} // tgen
ccc::FF3x12y15 ::FF3x12y15(){ note_ctor("_ZN3ccc9FF3x12y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x12y15E, buf);
    ::ccc::FF3x12y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x12y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y15E");
    check_base_class_offset(lv, (::ccc::EE3x12*), 0, "_ZN3ccc9FF3x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x12y15E);
    dp->::ccc::FF3x12y15::~FF3x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x12y15E(Test__ZN3ccc9FF3x12y15E, "_ZN3ccc9FF3x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x12y15C1Ev();
extern void _ZN3ccc9FF3x12y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x12y15E[] = {
  NSPAIR(_ZN3ccc9FF3x12y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x12E[];
static Base_Class bases__ZN3ccc9FF3x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF3x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x12y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv)();
extern void _ZN3ccc6EE3x123abcEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x12y15E[] = {
  {&(_ZTVN3ccc9FF3x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x12y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x12E__NS_9FF3x12y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x12y15E[];
static VTBL_ENTRY alt_thunk_names928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE3x123abcEv,_ZTv0_n20_N3ccc6EE3x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x12y15E = {  "_ZN3ccc9FF3x12y15E", // class name
  bases__ZN3ccc9FF3x12y15E, 2,
  &(vtc__ZN3ccc9FF3x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x12y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x12y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x12y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x12y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names928,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y0  : virtual ::ccc::EE3x13 {
  virtual void  abc(); // _ZN3ccc8FF3x13y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y03pqrEv
  ~FF3x13y0(); // tgen
  FF3x13y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y03abcEv");}
void  ccc::FF3x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y03efgEv");}
void  ccc::FF3x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y03pqrEv");}
ccc::FF3x13y0 ::~FF3x13y0(){ note_dtor("_ZN3ccc8FF3x13y0E", this);} // tgen
ccc::FF3x13y0 ::FF3x13y0(){ note_ctor("_ZN3ccc8FF3x13y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y0E, buf);
    ::ccc::FF3x13y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y0E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y0E);
    dp->::ccc::FF3x13y0::~FF3x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y0E(Test__ZN3ccc8FF3x13y0E, "_ZN3ccc8FF3x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y0C1Ev();
extern void _ZN3ccc8FF3x13y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y0E[] = {
  NSPAIR(_ZN3ccc8FF3x13y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y0E[];
extern void _ZN3ccc8FF3x13y03efgEv();
extern void _ZN3ccc8FF3x13y03pqrEv();
extern void _ZN3ccc8FF3x13y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y0E[] = {
  {&(_ZTVN3ccc8FF3x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y0E[];
static VTBL_ENTRY alt_thunk_names929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y0E = {  "_ZN3ccc8FF3x13y0E", // class name
  bases__ZN3ccc8FF3x13y0E, 2,
  &(vtc__ZN3ccc8FF3x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names929,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y1  : virtual ::ccc::EE3x13 {
  virtual void  abc(); // _ZN3ccc8FF3x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x13y13efgEv
  ~FF3x13y1(); // tgen
  FF3x13y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y13abcEv");}
void  ccc::FF3x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y13pqrEv");}
void  ccc::FF3x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y13efgEv");}
ccc::FF3x13y1 ::~FF3x13y1(){ note_dtor("_ZN3ccc8FF3x13y1E", this);} // tgen
ccc::FF3x13y1 ::FF3x13y1(){ note_ctor("_ZN3ccc8FF3x13y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y1E, buf);
    ::ccc::FF3x13y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y1E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y1E);
    dp->::ccc::FF3x13y1::~FF3x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y1E(Test__ZN3ccc8FF3x13y1E, "_ZN3ccc8FF3x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y1C1Ev();
extern void _ZN3ccc8FF3x13y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y1E[] = {
  NSPAIR(_ZN3ccc8FF3x13y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y1E[];
extern void _ZN3ccc8FF3x13y13efgEv();
extern void _ZN3ccc8FF3x13y13pqrEv();
extern void _ZN3ccc8FF3x13y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y1E[] = {
  {&(_ZTVN3ccc8FF3x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y1E[];
static VTBL_ENTRY alt_thunk_names930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y1E = {  "_ZN3ccc8FF3x13y1E", // class name
  bases__ZN3ccc8FF3x13y1E, 2,
  &(vtc__ZN3ccc8FF3x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names930,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y2  : virtual ::ccc::EE3x13 {
  virtual void  efg(); // _ZN3ccc8FF3x13y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y23pqrEv
  ~FF3x13y2(); // tgen
  FF3x13y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y23efgEv");}
void  ccc::FF3x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y23abcEv");}
void  ccc::FF3x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y23pqrEv");}
ccc::FF3x13y2 ::~FF3x13y2(){ note_dtor("_ZN3ccc8FF3x13y2E", this);} // tgen
ccc::FF3x13y2 ::FF3x13y2(){ note_ctor("_ZN3ccc8FF3x13y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y2E, buf);
    ::ccc::FF3x13y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y2E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y2E);
    dp->::ccc::FF3x13y2::~FF3x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y2E(Test__ZN3ccc8FF3x13y2E, "_ZN3ccc8FF3x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y2C1Ev();
extern void _ZN3ccc8FF3x13y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y2E[] = {
  NSPAIR(_ZN3ccc8FF3x13y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y2E[];
extern void _ZN3ccc8FF3x13y23efgEv();
extern void _ZN3ccc8FF3x13y23pqrEv();
extern void _ZN3ccc8FF3x13y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y2E[] = {
  {&(_ZTVN3ccc8FF3x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y2E[];
static VTBL_ENTRY alt_thunk_names931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y2E = {  "_ZN3ccc8FF3x13y2E", // class name
  bases__ZN3ccc8FF3x13y2E, 2,
  &(vtc__ZN3ccc8FF3x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names931,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y3  : virtual ::ccc::EE3x13 {
  virtual void  efg(); // _ZN3ccc8FF3x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x13y33abcEv
  ~FF3x13y3(); // tgen
  FF3x13y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y33efgEv");}
void  ccc::FF3x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y33pqrEv");}
void  ccc::FF3x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y33abcEv");}
ccc::FF3x13y3 ::~FF3x13y3(){ note_dtor("_ZN3ccc8FF3x13y3E", this);} // tgen
ccc::FF3x13y3 ::FF3x13y3(){ note_ctor("_ZN3ccc8FF3x13y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y3E, buf);
    ::ccc::FF3x13y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y3E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y3E);
    dp->::ccc::FF3x13y3::~FF3x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y3E(Test__ZN3ccc8FF3x13y3E, "_ZN3ccc8FF3x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y3C1Ev();
extern void _ZN3ccc8FF3x13y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y3E[] = {
  NSPAIR(_ZN3ccc8FF3x13y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y3E[];
extern void _ZN3ccc8FF3x13y33efgEv();
extern void _ZN3ccc8FF3x13y33pqrEv();
extern void _ZN3ccc8FF3x13y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y3E[] = {
  {&(_ZTVN3ccc8FF3x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y3E[];
static VTBL_ENTRY alt_thunk_names932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y3E = {  "_ZN3ccc8FF3x13y3E", // class name
  bases__ZN3ccc8FF3x13y3E, 2,
  &(vtc__ZN3ccc8FF3x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names932,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y4  : virtual ::ccc::EE3x13 {
  virtual void  pqr(); // _ZN3ccc8FF3x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x13y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x13y43efgEv
  ~FF3x13y4(); // tgen
  FF3x13y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y43pqrEv");}
void  ccc::FF3x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y43abcEv");}
void  ccc::FF3x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y43efgEv");}
ccc::FF3x13y4 ::~FF3x13y4(){ note_dtor("_ZN3ccc8FF3x13y4E", this);} // tgen
ccc::FF3x13y4 ::FF3x13y4(){ note_ctor("_ZN3ccc8FF3x13y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y4E, buf);
    ::ccc::FF3x13y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y4E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y4E);
    dp->::ccc::FF3x13y4::~FF3x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y4E(Test__ZN3ccc8FF3x13y4E, "_ZN3ccc8FF3x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y4C1Ev();
extern void _ZN3ccc8FF3x13y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y4E[] = {
  NSPAIR(_ZN3ccc8FF3x13y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y4E[];
extern void _ZN3ccc8FF3x13y43efgEv();
extern void _ZN3ccc8FF3x13y43pqrEv();
extern void _ZN3ccc8FF3x13y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y4E[] = {
  {&(_ZTVN3ccc8FF3x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y4E[];
static VTBL_ENTRY alt_thunk_names933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y4E = {  "_ZN3ccc8FF3x13y4E", // class name
  bases__ZN3ccc8FF3x13y4E, 2,
  &(vtc__ZN3ccc8FF3x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names933,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y5  : virtual ::ccc::EE3x13 {
  virtual void  pqr(); // _ZN3ccc8FF3x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x13y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x13y53abcEv
  ~FF3x13y5(); // tgen
  FF3x13y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y53pqrEv");}
void  ccc::FF3x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y53efgEv");}
void  ccc::FF3x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y53abcEv");}
ccc::FF3x13y5 ::~FF3x13y5(){ note_dtor("_ZN3ccc8FF3x13y5E", this);} // tgen
ccc::FF3x13y5 ::FF3x13y5(){ note_ctor("_ZN3ccc8FF3x13y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y5E, buf);
    ::ccc::FF3x13y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y5E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y5E);
    dp->::ccc::FF3x13y5::~FF3x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y5E(Test__ZN3ccc8FF3x13y5E, "_ZN3ccc8FF3x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y5C1Ev();
extern void _ZN3ccc8FF3x13y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y5E[] = {
  NSPAIR(_ZN3ccc8FF3x13y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y5E[];
extern void _ZN3ccc8FF3x13y53efgEv();
extern void _ZN3ccc8FF3x13y53pqrEv();
extern void _ZN3ccc8FF3x13y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y5E[] = {
  {&(_ZTVN3ccc8FF3x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y5E[];
static VTBL_ENTRY alt_thunk_names934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y5E = {  "_ZN3ccc8FF3x13y5E", // class name
  bases__ZN3ccc8FF3x13y5E, 2,
  &(vtc__ZN3ccc8FF3x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names934,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y6  : virtual ::ccc::EE3x13 {
  virtual void  abc(); // _ZN3ccc8FF3x13y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x13y63efgEv
  ~FF3x13y6(); // tgen
  FF3x13y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y63abcEv");}
void  ccc::FF3x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y63efgEv");}
ccc::FF3x13y6 ::~FF3x13y6(){ note_dtor("_ZN3ccc8FF3x13y6E", this);} // tgen
ccc::FF3x13y6 ::FF3x13y6(){ note_ctor("_ZN3ccc8FF3x13y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y6E, buf);
    ::ccc::FF3x13y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y6E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y6E);
    dp->::ccc::FF3x13y6::~FF3x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y6E(Test__ZN3ccc8FF3x13y6E, "_ZN3ccc8FF3x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y6C1Ev();
extern void _ZN3ccc8FF3x13y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y6E[] = {
  NSPAIR(_ZN3ccc8FF3x13y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y6E[];
extern void _ZN3ccc8FF3x13y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x13y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y6E[] = {
  {&(_ZTVN3ccc8FF3x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y6E[];
static VTBL_ENTRY alt_thunk_names935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y6E = {  "_ZN3ccc8FF3x13y6E", // class name
  bases__ZN3ccc8FF3x13y6E, 2,
  &(vtc__ZN3ccc8FF3x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names935,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y7  : virtual ::ccc::EE3x13 {
  virtual void  abc(); // _ZN3ccc8FF3x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y73pqrEv
  ~FF3x13y7(); // tgen
  FF3x13y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y73abcEv");}
void  ccc::FF3x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y73pqrEv");}
ccc::FF3x13y7 ::~FF3x13y7(){ note_dtor("_ZN3ccc8FF3x13y7E", this);} // tgen
ccc::FF3x13y7 ::FF3x13y7(){ note_ctor("_ZN3ccc8FF3x13y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y7E, buf);
    ::ccc::FF3x13y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y7E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y7E);
    dp->::ccc::FF3x13y7::~FF3x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y7E(Test__ZN3ccc8FF3x13y7E, "_ZN3ccc8FF3x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y7C1Ev();
extern void _ZN3ccc8FF3x13y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y7E[] = {
  NSPAIR(_ZN3ccc8FF3x13y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc8FF3x13y73pqrEv();
extern void _ZN3ccc8FF3x13y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y7E[] = {
  {&(_ZTVN3ccc8FF3x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y7E[];
static VTBL_ENTRY alt_thunk_names936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y7E = {  "_ZN3ccc8FF3x13y7E", // class name
  bases__ZN3ccc8FF3x13y7E, 2,
  &(vtc__ZN3ccc8FF3x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names936,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y8  : virtual ::ccc::EE3x13 {
  virtual void  efg(); // _ZN3ccc8FF3x13y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x13y83abcEv
  ~FF3x13y8(); // tgen
  FF3x13y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y83efgEv");}
void  ccc::FF3x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x13y83abcEv");}
ccc::FF3x13y8 ::~FF3x13y8(){ note_dtor("_ZN3ccc8FF3x13y8E", this);} // tgen
ccc::FF3x13y8 ::FF3x13y8(){ note_ctor("_ZN3ccc8FF3x13y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y8E, buf);
    ::ccc::FF3x13y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y8E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y8E);
    dp->::ccc::FF3x13y8::~FF3x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y8E(Test__ZN3ccc8FF3x13y8E, "_ZN3ccc8FF3x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y8C1Ev();
extern void _ZN3ccc8FF3x13y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y8E[] = {
  NSPAIR(_ZN3ccc8FF3x13y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y8E[];
extern void _ZN3ccc8FF3x13y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x13y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y8E[] = {
  {&(_ZTVN3ccc8FF3x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y8E[];
static VTBL_ENTRY alt_thunk_names937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y8E = {  "_ZN3ccc8FF3x13y8E", // class name
  bases__ZN3ccc8FF3x13y8E, 2,
  &(vtc__ZN3ccc8FF3x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names937,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y9  : virtual ::ccc::EE3x13 {
  virtual void  efg(); // _ZN3ccc8FF3x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x13y93pqrEv
  ~FF3x13y9(); // tgen
  FF3x13y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x13y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x13y93efgEv");}
void  ccc::FF3x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x13y93pqrEv");}
ccc::FF3x13y9 ::~FF3x13y9(){ note_dtor("_ZN3ccc8FF3x13y9E", this);} // tgen
ccc::FF3x13y9 ::FF3x13y9(){ note_ctor("_ZN3ccc8FF3x13y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x13y9E, buf);
    ::ccc::FF3x13y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x13y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y9E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc8FF3x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x13y9E);
    dp->::ccc::FF3x13y9::~FF3x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x13y9E(Test__ZN3ccc8FF3x13y9E, "_ZN3ccc8FF3x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x13y9C1Ev();
extern void _ZN3ccc8FF3x13y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x13y9E[] = {
  NSPAIR(_ZN3ccc8FF3x13y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc8FF3x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y9E[];
extern void _ZN3ccc8FF3x13y93efgEv();
extern void _ZN3ccc8FF3x13y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x13y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x13y9E[] = {
  {&(_ZTVN3ccc8FF3x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x13y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_8FF3x13y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x13y9E[];
static VTBL_ENTRY alt_thunk_names938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x13y9E = {  "_ZN3ccc8FF3x13y9E", // class name
  bases__ZN3ccc8FF3x13y9E, 2,
  &(vtc__ZN3ccc8FF3x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x13y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x13y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x13y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x13y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names938,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y10  : virtual ::ccc::EE3x13 {
  virtual void  pqr(); // _ZN3ccc9FF3x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x13y103abcEv
  ~FF3x13y10(); // tgen
  FF3x13y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x13y103pqrEv");}
void  ccc::FF3x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x13y103abcEv");}
ccc::FF3x13y10 ::~FF3x13y10(){ note_dtor("_ZN3ccc9FF3x13y10E", this);} // tgen
ccc::FF3x13y10 ::FF3x13y10(){ note_ctor("_ZN3ccc9FF3x13y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y10E, buf);
    ::ccc::FF3x13y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y10E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y10E);
    dp->::ccc::FF3x13y10::~FF3x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y10E(Test__ZN3ccc9FF3x13y10E, "_ZN3ccc9FF3x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y10C1Ev();
extern void _ZN3ccc9FF3x13y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y10E[] = {
  NSPAIR(_ZN3ccc9FF3x13y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF3x13y103pqrEv();
extern void _ZN3ccc9FF3x13y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y10E[] = {
  {&(_ZTVN3ccc9FF3x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y10E[];
static VTBL_ENTRY alt_thunk_names939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y10E = {  "_ZN3ccc9FF3x13y10E", // class name
  bases__ZN3ccc9FF3x13y10E, 2,
  &(vtc__ZN3ccc9FF3x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names939,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y11  : virtual ::ccc::EE3x13 {
  virtual void  pqr(); // _ZN3ccc9FF3x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x13y113efgEv
  ~FF3x13y11(); // tgen
  FF3x13y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x13y113pqrEv");}
void  ccc::FF3x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x13y113efgEv");}
ccc::FF3x13y11 ::~FF3x13y11(){ note_dtor("_ZN3ccc9FF3x13y11E", this);} // tgen
ccc::FF3x13y11 ::FF3x13y11(){ note_ctor("_ZN3ccc9FF3x13y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y11E, buf);
    ::ccc::FF3x13y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y11E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y11E);
    dp->::ccc::FF3x13y11::~FF3x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y11E(Test__ZN3ccc9FF3x13y11E, "_ZN3ccc9FF3x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y11C1Ev();
extern void _ZN3ccc9FF3x13y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y11E[] = {
  NSPAIR(_ZN3ccc9FF3x13y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y11E[];
extern void _ZN3ccc9FF3x13y113efgEv();
extern void _ZN3ccc9FF3x13y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y11E[] = {
  {&(_ZTVN3ccc9FF3x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y11E[];
static VTBL_ENTRY alt_thunk_names940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y11E = {  "_ZN3ccc9FF3x13y11E", // class name
  bases__ZN3ccc9FF3x13y11E, 2,
  &(vtc__ZN3ccc9FF3x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names940,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y12  : virtual ::ccc::EE3x13 {
  virtual void  abc(); // _ZN3ccc9FF3x13y123abcEv
  ~FF3x13y12(); // tgen
  FF3x13y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y12E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF3x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x13y123abcEv");}
ccc::FF3x13y12 ::~FF3x13y12(){ note_dtor("_ZN3ccc9FF3x13y12E", this);} // tgen
ccc::FF3x13y12 ::FF3x13y12(){ note_ctor("_ZN3ccc9FF3x13y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y12E, buf);
    ::ccc::FF3x13y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y12E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y12E);
    dp->::ccc::FF3x13y12::~FF3x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y12E(Test__ZN3ccc9FF3x13y12E, "_ZN3ccc9FF3x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y12C1Ev();
extern void _ZN3ccc9FF3x13y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y12E[] = {
  NSPAIR(_ZN3ccc9FF3x13y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9FF3x13y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y12E[] = {
  {&(_ZTVN3ccc9FF3x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y12E[];
static VTBL_ENTRY alt_thunk_names941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y12E = {  "_ZN3ccc9FF3x13y12E", // class name
  bases__ZN3ccc9FF3x13y12E, 2,
  &(vtc__ZN3ccc9FF3x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names941,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y13  : virtual ::ccc::EE3x13 {
  virtual void  efg(); // _ZN3ccc9FF3x13y133efgEv
  ~FF3x13y13(); // tgen
  FF3x13y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF3x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x13y133efgEv");}
ccc::FF3x13y13 ::~FF3x13y13(){ note_dtor("_ZN3ccc9FF3x13y13E", this);} // tgen
ccc::FF3x13y13 ::FF3x13y13(){ note_ctor("_ZN3ccc9FF3x13y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y13E, buf);
    ::ccc::FF3x13y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y13E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y13E);
    dp->::ccc::FF3x13y13::~FF3x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y13E(Test__ZN3ccc9FF3x13y13E, "_ZN3ccc9FF3x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y13C1Ev();
extern void _ZN3ccc9FF3x13y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y13E[] = {
  NSPAIR(_ZN3ccc9FF3x13y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y13E[];
extern void _ZN3ccc9FF3x13y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y13E[] = {
  {&(_ZTVN3ccc9FF3x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y13E[];
static VTBL_ENTRY alt_thunk_names942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y13E = {  "_ZN3ccc9FF3x13y13E", // class name
  bases__ZN3ccc9FF3x13y13E, 2,
  &(vtc__ZN3ccc9FF3x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names942,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y14  : virtual ::ccc::EE3x13 {
  virtual void  pqr(); // _ZN3ccc9FF3x13y143pqrEv
  ~FF3x13y14(); // tgen
  FF3x13y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF3x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x13y143pqrEv");}
ccc::FF3x13y14 ::~FF3x13y14(){ note_dtor("_ZN3ccc9FF3x13y14E", this);} // tgen
ccc::FF3x13y14 ::FF3x13y14(){ note_ctor("_ZN3ccc9FF3x13y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y14E, buf);
    ::ccc::FF3x13y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y14E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y14E);
    dp->::ccc::FF3x13y14::~FF3x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y14E(Test__ZN3ccc9FF3x13y14E, "_ZN3ccc9FF3x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y14C1Ev();
extern void _ZN3ccc9FF3x13y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y14E[] = {
  NSPAIR(_ZN3ccc9FF3x13y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc9FF3x13y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y14E[] = {
  {&(_ZTVN3ccc9FF3x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y14E[];
static VTBL_ENTRY alt_thunk_names943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y14E = {  "_ZN3ccc9FF3x13y14E", // class name
  bases__ZN3ccc9FF3x13y14E, 2,
  &(vtc__ZN3ccc9FF3x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names943,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x13y15  : virtual ::ccc::EE3x13 {
  ~FF3x13y15(); // tgen
  FF3x13y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x13y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1}}
}
namespace ccc { 
ccc::FF3x13y15 ::~FF3x13y15(){ note_dtor("_ZN3ccc9FF3x13y15E", this);} // tgen
ccc::FF3x13y15 ::FF3x13y15(){ note_ctor("_ZN3ccc9FF3x13y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x13y15E, buf);
    ::ccc::FF3x13y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x13y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y15E");
    check_base_class_offset(lv, (::ccc::EE3x13*), 0, "_ZN3ccc9FF3x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x13y15E);
    dp->::ccc::FF3x13y15::~FF3x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x13y15E(Test__ZN3ccc9FF3x13y15E, "_ZN3ccc9FF3x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x13y15C1Ev();
extern void _ZN3ccc9FF3x13y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x13y15E[] = {
  NSPAIR(_ZN3ccc9FF3x13y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x13E[];
static Base_Class bases__ZN3ccc9FF3x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x13y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x13y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv)();
extern void _ZN3ccc6EE3x133efgEv() __attribute__((weak));
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x13y15E[] = {
  {&(_ZTVN3ccc9FF3x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x13y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x13E__NS_9FF3x13y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x13y15E[];
static VTBL_ENTRY alt_thunk_names944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE3x133efgEv,_ZTv0_n12_N3ccc6EE3x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x13y15E = {  "_ZN3ccc9FF3x13y15E", // class name
  bases__ZN3ccc9FF3x13y15E, 2,
  &(vtc__ZN3ccc9FF3x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x13y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x13y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x13y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x13y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names944,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y0  : virtual ::ccc::EE3x14 {
  virtual void  abc(); // _ZN3ccc8FF3x14y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y03pqrEv
  ~FF3x14y0(); // tgen
  FF3x14y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y0E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y03abcEv");}
void  ccc::FF3x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y03efgEv");}
void  ccc::FF3x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y03pqrEv");}
ccc::FF3x14y0 ::~FF3x14y0(){ note_dtor("_ZN3ccc8FF3x14y0E", this);} // tgen
ccc::FF3x14y0 ::FF3x14y0(){ note_ctor("_ZN3ccc8FF3x14y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y0E, buf);
    ::ccc::FF3x14y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y0E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y0E);
    dp->::ccc::FF3x14y0::~FF3x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y0E(Test__ZN3ccc8FF3x14y0E, "_ZN3ccc8FF3x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y0C1Ev();
extern void _ZN3ccc8FF3x14y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y0E[] = {
  NSPAIR(_ZN3ccc8FF3x14y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y0E[];
extern void _ZN3ccc8FF3x14y03efgEv();
extern void _ZN3ccc8FF3x14y03pqrEv();
extern void _ZN3ccc8FF3x14y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y0E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y0E[] = {
  {&(_ZTVN3ccc8FF3x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y0E[];
static VTBL_ENTRY alt_thunk_names945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y0E = {  "_ZN3ccc8FF3x14y0E", // class name
  bases__ZN3ccc8FF3x14y0E, 2,
  &(vtc__ZN3ccc8FF3x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names945,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y1  : virtual ::ccc::EE3x14 {
  virtual void  abc(); // _ZN3ccc8FF3x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x14y13efgEv
  ~FF3x14y1(); // tgen
  FF3x14y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y1E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y13abcEv");}
void  ccc::FF3x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y13pqrEv");}
void  ccc::FF3x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y13efgEv");}
ccc::FF3x14y1 ::~FF3x14y1(){ note_dtor("_ZN3ccc8FF3x14y1E", this);} // tgen
ccc::FF3x14y1 ::FF3x14y1(){ note_ctor("_ZN3ccc8FF3x14y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y1E, buf);
    ::ccc::FF3x14y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y1E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y1E);
    dp->::ccc::FF3x14y1::~FF3x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y1E(Test__ZN3ccc8FF3x14y1E, "_ZN3ccc8FF3x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y1C1Ev();
extern void _ZN3ccc8FF3x14y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y1E[] = {
  NSPAIR(_ZN3ccc8FF3x14y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y1E[];
extern void _ZN3ccc8FF3x14y13efgEv();
extern void _ZN3ccc8FF3x14y13pqrEv();
extern void _ZN3ccc8FF3x14y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y1E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y1E[] = {
  {&(_ZTVN3ccc8FF3x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y1E[];
static VTBL_ENTRY alt_thunk_names946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y1E = {  "_ZN3ccc8FF3x14y1E", // class name
  bases__ZN3ccc8FF3x14y1E, 2,
  &(vtc__ZN3ccc8FF3x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names946,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y2  : virtual ::ccc::EE3x14 {
  virtual void  efg(); // _ZN3ccc8FF3x14y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y23pqrEv
  ~FF3x14y2(); // tgen
  FF3x14y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y2E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y23efgEv");}
void  ccc::FF3x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y23abcEv");}
void  ccc::FF3x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y23pqrEv");}
ccc::FF3x14y2 ::~FF3x14y2(){ note_dtor("_ZN3ccc8FF3x14y2E", this);} // tgen
ccc::FF3x14y2 ::FF3x14y2(){ note_ctor("_ZN3ccc8FF3x14y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y2E, buf);
    ::ccc::FF3x14y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y2E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y2E);
    dp->::ccc::FF3x14y2::~FF3x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y2E(Test__ZN3ccc8FF3x14y2E, "_ZN3ccc8FF3x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y2C1Ev();
extern void _ZN3ccc8FF3x14y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y2E[] = {
  NSPAIR(_ZN3ccc8FF3x14y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y2E[];
extern void _ZN3ccc8FF3x14y23efgEv();
extern void _ZN3ccc8FF3x14y23pqrEv();
extern void _ZN3ccc8FF3x14y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y2E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y2E[] = {
  {&(_ZTVN3ccc8FF3x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y2E[];
static VTBL_ENTRY alt_thunk_names947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y2E = {  "_ZN3ccc8FF3x14y2E", // class name
  bases__ZN3ccc8FF3x14y2E, 2,
  &(vtc__ZN3ccc8FF3x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names947,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y3  : virtual ::ccc::EE3x14 {
  virtual void  efg(); // _ZN3ccc8FF3x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x14y33abcEv
  ~FF3x14y3(); // tgen
  FF3x14y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y3E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y33efgEv");}
void  ccc::FF3x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y33pqrEv");}
void  ccc::FF3x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y33abcEv");}
ccc::FF3x14y3 ::~FF3x14y3(){ note_dtor("_ZN3ccc8FF3x14y3E", this);} // tgen
ccc::FF3x14y3 ::FF3x14y3(){ note_ctor("_ZN3ccc8FF3x14y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y3E, buf);
    ::ccc::FF3x14y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y3E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y3E);
    dp->::ccc::FF3x14y3::~FF3x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y3E(Test__ZN3ccc8FF3x14y3E, "_ZN3ccc8FF3x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y3C1Ev();
extern void _ZN3ccc8FF3x14y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y3E[] = {
  NSPAIR(_ZN3ccc8FF3x14y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y3E[];
extern void _ZN3ccc8FF3x14y33efgEv();
extern void _ZN3ccc8FF3x14y33pqrEv();
extern void _ZN3ccc8FF3x14y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y3E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y3E[] = {
  {&(_ZTVN3ccc8FF3x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y3E[];
static VTBL_ENTRY alt_thunk_names948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y3E = {  "_ZN3ccc8FF3x14y3E", // class name
  bases__ZN3ccc8FF3x14y3E, 2,
  &(vtc__ZN3ccc8FF3x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names948,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y4  : virtual ::ccc::EE3x14 {
  virtual void  pqr(); // _ZN3ccc8FF3x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x14y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x14y43efgEv
  ~FF3x14y4(); // tgen
  FF3x14y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y4E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y43pqrEv");}
void  ccc::FF3x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y43abcEv");}
void  ccc::FF3x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y43efgEv");}
ccc::FF3x14y4 ::~FF3x14y4(){ note_dtor("_ZN3ccc8FF3x14y4E", this);} // tgen
ccc::FF3x14y4 ::FF3x14y4(){ note_ctor("_ZN3ccc8FF3x14y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y4E, buf);
    ::ccc::FF3x14y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y4E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y4E);
    dp->::ccc::FF3x14y4::~FF3x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y4E(Test__ZN3ccc8FF3x14y4E, "_ZN3ccc8FF3x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y4C1Ev();
extern void _ZN3ccc8FF3x14y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y4E[] = {
  NSPAIR(_ZN3ccc8FF3x14y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y4E[];
extern void _ZN3ccc8FF3x14y43efgEv();
extern void _ZN3ccc8FF3x14y43pqrEv();
extern void _ZN3ccc8FF3x14y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y4E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y4E[] = {
  {&(_ZTVN3ccc8FF3x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y4E[];
static VTBL_ENTRY alt_thunk_names949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y4E = {  "_ZN3ccc8FF3x14y4E", // class name
  bases__ZN3ccc8FF3x14y4E, 2,
  &(vtc__ZN3ccc8FF3x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names949,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y5  : virtual ::ccc::EE3x14 {
  virtual void  pqr(); // _ZN3ccc8FF3x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x14y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x14y53abcEv
  ~FF3x14y5(); // tgen
  FF3x14y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y5E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y53pqrEv");}
void  ccc::FF3x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y53efgEv");}
void  ccc::FF3x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y53abcEv");}
ccc::FF3x14y5 ::~FF3x14y5(){ note_dtor("_ZN3ccc8FF3x14y5E", this);} // tgen
ccc::FF3x14y5 ::FF3x14y5(){ note_ctor("_ZN3ccc8FF3x14y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y5E, buf);
    ::ccc::FF3x14y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y5E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y5E);
    dp->::ccc::FF3x14y5::~FF3x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y5E(Test__ZN3ccc8FF3x14y5E, "_ZN3ccc8FF3x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y5C1Ev();
extern void _ZN3ccc8FF3x14y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y5E[] = {
  NSPAIR(_ZN3ccc8FF3x14y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y5E[];
extern void _ZN3ccc8FF3x14y53efgEv();
extern void _ZN3ccc8FF3x14y53pqrEv();
extern void _ZN3ccc8FF3x14y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y5E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y5E[] = {
  {&(_ZTVN3ccc8FF3x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y5E[];
static VTBL_ENTRY alt_thunk_names950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y5E = {  "_ZN3ccc8FF3x14y5E", // class name
  bases__ZN3ccc8FF3x14y5E, 2,
  &(vtc__ZN3ccc8FF3x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names950,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y6  : virtual ::ccc::EE3x14 {
  virtual void  abc(); // _ZN3ccc8FF3x14y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x14y63efgEv
  ~FF3x14y6(); // tgen
  FF3x14y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y6E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y63abcEv");}
void  ccc::FF3x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y63efgEv");}
ccc::FF3x14y6 ::~FF3x14y6(){ note_dtor("_ZN3ccc8FF3x14y6E", this);} // tgen
ccc::FF3x14y6 ::FF3x14y6(){ note_ctor("_ZN3ccc8FF3x14y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y6E, buf);
    ::ccc::FF3x14y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y6E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y6E);
    dp->::ccc::FF3x14y6::~FF3x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y6E(Test__ZN3ccc8FF3x14y6E, "_ZN3ccc8FF3x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y6C1Ev();
extern void _ZN3ccc8FF3x14y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y6E[] = {
  NSPAIR(_ZN3ccc8FF3x14y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y6E[];
extern void _ZN3ccc8FF3x14y63efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x14y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y63efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y6E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y6E[] = {
  {&(_ZTVN3ccc8FF3x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y6E[];
static VTBL_ENTRY alt_thunk_names951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y6E = {  "_ZN3ccc8FF3x14y6E", // class name
  bases__ZN3ccc8FF3x14y6E, 2,
  &(vtc__ZN3ccc8FF3x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names951,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y7  : virtual ::ccc::EE3x14 {
  virtual void  abc(); // _ZN3ccc8FF3x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y73pqrEv
  ~FF3x14y7(); // tgen
  FF3x14y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y7E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y73abcEv");}
void  ccc::FF3x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y73pqrEv");}
ccc::FF3x14y7 ::~FF3x14y7(){ note_dtor("_ZN3ccc8FF3x14y7E", this);} // tgen
ccc::FF3x14y7 ::FF3x14y7(){ note_ctor("_ZN3ccc8FF3x14y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y7E, buf);
    ::ccc::FF3x14y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y7E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y7E);
    dp->::ccc::FF3x14y7::~FF3x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y7E(Test__ZN3ccc8FF3x14y7E, "_ZN3ccc8FF3x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y7C1Ev();
extern void _ZN3ccc8FF3x14y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y7E[] = {
  NSPAIR(_ZN3ccc8FF3x14y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x14y73pqrEv();
extern void _ZN3ccc8FF3x14y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y7E[] = {
  {&(_ZTVN3ccc8FF3x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y7E[];
static VTBL_ENTRY alt_thunk_names952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y7E = {  "_ZN3ccc8FF3x14y7E", // class name
  bases__ZN3ccc8FF3x14y7E, 2,
  &(vtc__ZN3ccc8FF3x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names952,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y8  : virtual ::ccc::EE3x14 {
  virtual void  efg(); // _ZN3ccc8FF3x14y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x14y83abcEv
  ~FF3x14y8(); // tgen
  FF3x14y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y8E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y83efgEv");}
void  ccc::FF3x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x14y83abcEv");}
ccc::FF3x14y8 ::~FF3x14y8(){ note_dtor("_ZN3ccc8FF3x14y8E", this);} // tgen
ccc::FF3x14y8 ::FF3x14y8(){ note_ctor("_ZN3ccc8FF3x14y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y8E, buf);
    ::ccc::FF3x14y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y8E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y8E);
    dp->::ccc::FF3x14y8::~FF3x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y8E(Test__ZN3ccc8FF3x14y8E, "_ZN3ccc8FF3x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y8C1Ev();
extern void _ZN3ccc8FF3x14y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y8E[] = {
  NSPAIR(_ZN3ccc8FF3x14y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y8E[];
extern void _ZN3ccc8FF3x14y83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF3x14y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y8E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y8E[] = {
  {&(_ZTVN3ccc8FF3x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y8E[];
static VTBL_ENTRY alt_thunk_names953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y8E = {  "_ZN3ccc8FF3x14y8E", // class name
  bases__ZN3ccc8FF3x14y8E, 2,
  &(vtc__ZN3ccc8FF3x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names953,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y9  : virtual ::ccc::EE3x14 {
  virtual void  efg(); // _ZN3ccc8FF3x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x14y93pqrEv
  ~FF3x14y9(); // tgen
  FF3x14y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x14y9E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x14y93efgEv");}
void  ccc::FF3x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x14y93pqrEv");}
ccc::FF3x14y9 ::~FF3x14y9(){ note_dtor("_ZN3ccc8FF3x14y9E", this);} // tgen
ccc::FF3x14y9 ::FF3x14y9(){ note_ctor("_ZN3ccc8FF3x14y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x14y9E, buf);
    ::ccc::FF3x14y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x14y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y9E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc8FF3x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x14y9E);
    dp->::ccc::FF3x14y9::~FF3x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x14y9E(Test__ZN3ccc8FF3x14y9E, "_ZN3ccc8FF3x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x14y9C1Ev();
extern void _ZN3ccc8FF3x14y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x14y9E[] = {
  NSPAIR(_ZN3ccc8FF3x14y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc8FF3x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y9E[];
extern void _ZN3ccc8FF3x14y93efgEv();
extern void _ZN3ccc8FF3x14y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x14y9E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x14y9E[] = {
  {&(_ZTVN3ccc8FF3x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x14y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_8FF3x14y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x14y9E[];
static VTBL_ENTRY alt_thunk_names954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF3x14y9E = {  "_ZN3ccc8FF3x14y9E", // class name
  bases__ZN3ccc8FF3x14y9E, 2,
  &(vtc__ZN3ccc8FF3x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x14y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x14y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x14y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x14y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names954,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y10  : virtual ::ccc::EE3x14 {
  virtual void  pqr(); // _ZN3ccc9FF3x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x14y103abcEv
  ~FF3x14y10(); // tgen
  FF3x14y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y10E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x14y103pqrEv");}
void  ccc::FF3x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x14y103abcEv");}
ccc::FF3x14y10 ::~FF3x14y10(){ note_dtor("_ZN3ccc9FF3x14y10E", this);} // tgen
ccc::FF3x14y10 ::FF3x14y10(){ note_ctor("_ZN3ccc9FF3x14y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y10E, buf);
    ::ccc::FF3x14y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y10E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y10E);
    dp->::ccc::FF3x14y10::~FF3x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y10E(Test__ZN3ccc9FF3x14y10E, "_ZN3ccc9FF3x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y10C1Ev();
extern void _ZN3ccc9FF3x14y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y10E[] = {
  NSPAIR(_ZN3ccc9FF3x14y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x14y103pqrEv();
extern void _ZN3ccc9FF3x14y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y10E[] = {
  {&(_ZTVN3ccc9FF3x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y10E[];
static VTBL_ENTRY alt_thunk_names955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y10E = {  "_ZN3ccc9FF3x14y10E", // class name
  bases__ZN3ccc9FF3x14y10E, 2,
  &(vtc__ZN3ccc9FF3x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names955,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y11  : virtual ::ccc::EE3x14 {
  virtual void  pqr(); // _ZN3ccc9FF3x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x14y113efgEv
  ~FF3x14y11(); // tgen
  FF3x14y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y11E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF3x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x14y113pqrEv");}
void  ccc::FF3x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x14y113efgEv");}
ccc::FF3x14y11 ::~FF3x14y11(){ note_dtor("_ZN3ccc9FF3x14y11E", this);} // tgen
ccc::FF3x14y11 ::FF3x14y11(){ note_ctor("_ZN3ccc9FF3x14y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y11E, buf);
    ::ccc::FF3x14y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y11E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y11E);
    dp->::ccc::FF3x14y11::~FF3x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y11E(Test__ZN3ccc9FF3x14y11E, "_ZN3ccc9FF3x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y11C1Ev();
extern void _ZN3ccc9FF3x14y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y11E[] = {
  NSPAIR(_ZN3ccc9FF3x14y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y11E[];
extern void _ZN3ccc9FF3x14y113efgEv();
extern void _ZN3ccc9FF3x14y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y11E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y11E[] = {
  {&(_ZTVN3ccc9FF3x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y11E[];
static VTBL_ENTRY alt_thunk_names956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y11E = {  "_ZN3ccc9FF3x14y11E", // class name
  bases__ZN3ccc9FF3x14y11E, 2,
  &(vtc__ZN3ccc9FF3x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names956,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y12  : virtual ::ccc::EE3x14 {
  virtual void  abc(); // _ZN3ccc9FF3x14y123abcEv
  ~FF3x14y12(); // tgen
  FF3x14y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y12E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF3x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x14y123abcEv");}
ccc::FF3x14y12 ::~FF3x14y12(){ note_dtor("_ZN3ccc9FF3x14y12E", this);} // tgen
ccc::FF3x14y12 ::FF3x14y12(){ note_ctor("_ZN3ccc9FF3x14y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y12E, buf);
    ::ccc::FF3x14y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y12E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y12E);
    dp->::ccc::FF3x14y12::~FF3x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y12E(Test__ZN3ccc9FF3x14y12E, "_ZN3ccc9FF3x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y12C1Ev();
extern void _ZN3ccc9FF3x14y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y12E[] = {
  NSPAIR(_ZN3ccc9FF3x14y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF3x14y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y12E[] = {
  {&(_ZTVN3ccc9FF3x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y12E[];
static VTBL_ENTRY alt_thunk_names957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y12E = {  "_ZN3ccc9FF3x14y12E", // class name
  bases__ZN3ccc9FF3x14y12E, 2,
  &(vtc__ZN3ccc9FF3x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names957,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y13  : virtual ::ccc::EE3x14 {
  virtual void  efg(); // _ZN3ccc9FF3x14y133efgEv
  ~FF3x14y13(); // tgen
  FF3x14y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y13E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF3x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x14y133efgEv");}
ccc::FF3x14y13 ::~FF3x14y13(){ note_dtor("_ZN3ccc9FF3x14y13E", this);} // tgen
ccc::FF3x14y13 ::FF3x14y13(){ note_ctor("_ZN3ccc9FF3x14y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y13E, buf);
    ::ccc::FF3x14y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y13E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y13E);
    dp->::ccc::FF3x14y13::~FF3x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y13E(Test__ZN3ccc9FF3x14y13E, "_ZN3ccc9FF3x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y13C1Ev();
extern void _ZN3ccc9FF3x14y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y13E[] = {
  NSPAIR(_ZN3ccc9FF3x14y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y13E[];
extern void _ZN3ccc9FF3x14y133efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y133efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y13E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y13E[] = {
  {&(_ZTVN3ccc9FF3x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y13E[];
static VTBL_ENTRY alt_thunk_names958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y13E = {  "_ZN3ccc9FF3x14y13E", // class name
  bases__ZN3ccc9FF3x14y13E, 2,
  &(vtc__ZN3ccc9FF3x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names958,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y14  : virtual ::ccc::EE3x14 {
  virtual void  pqr(); // _ZN3ccc9FF3x14y143pqrEv
  ~FF3x14y14(); // tgen
  FF3x14y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y14E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF3x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x14y143pqrEv");}
ccc::FF3x14y14 ::~FF3x14y14(){ note_dtor("_ZN3ccc9FF3x14y14E", this);} // tgen
ccc::FF3x14y14 ::FF3x14y14(){ note_ctor("_ZN3ccc9FF3x14y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y14E, buf);
    ::ccc::FF3x14y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y14E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y14E);
    dp->::ccc::FF3x14y14::~FF3x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y14E(Test__ZN3ccc9FF3x14y14E, "_ZN3ccc9FF3x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y14C1Ev();
extern void _ZN3ccc9FF3x14y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y14E[] = {
  NSPAIR(_ZN3ccc9FF3x14y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x14y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y14E[] = {
  {&(_ZTVN3ccc9FF3x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y14E[];
static VTBL_ENTRY alt_thunk_names959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y14E = {  "_ZN3ccc9FF3x14y14E", // class name
  bases__ZN3ccc9FF3x14y14E, 2,
  &(vtc__ZN3ccc9FF3x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names959,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x14y15  : virtual ::ccc::EE3x14 {
  ~FF3x14y15(); // tgen
  FF3x14y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x14y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1}}
}
namespace ccc { 
ccc::FF3x14y15 ::~FF3x14y15(){ note_dtor("_ZN3ccc9FF3x14y15E", this);} // tgen
ccc::FF3x14y15 ::FF3x14y15(){ note_ctor("_ZN3ccc9FF3x14y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x14y15E, buf);
    ::ccc::FF3x14y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x14y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y15E");
    check_base_class_offset(lv, (::ccc::EE3x14*), 0, "_ZN3ccc9FF3x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x14y15E);
    dp->::ccc::FF3x14y15::~FF3x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x14y15E(Test__ZN3ccc9FF3x14y15E, "_ZN3ccc9FF3x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x14y15C1Ev();
extern void _ZN3ccc9FF3x14y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x14y15E[] = {
  NSPAIR(_ZN3ccc9FF3x14y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x14E[];
static Base_Class bases__ZN3ccc9FF3x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x14y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv)();
extern void _ZN3ccc6EE3x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x14y15E[] = {
  {&(_ZTVN3ccc9FF3x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x14y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x14E__NS_9FF3x14y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x14y15E[];
static VTBL_ENTRY alt_thunk_names960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE3x143pqrEv,_ZTv0_n16_N3ccc6EE3x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE3x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF3x14y15E = {  "_ZN3ccc9FF3x14y15E", // class name
  bases__ZN3ccc9FF3x14y15E, 2,
  &(vtc__ZN3ccc9FF3x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x14y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x14y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x14y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x14y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names960,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF3x15y0  : virtual ::ccc::EE3x15 {
  virtual void  abc(); // _ZN3ccc8FF3x15y03abcEv
  virtual void  efg(); // _ZN3ccc8FF3x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y03pqrEv
  ~FF3x15y0(); // tgen
  FF3x15y0(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y0E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y03abcEv");}
void  ccc::FF3x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y03efgEv");}
void  ccc::FF3x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y03pqrEv");}
ccc::FF3x15y0 ::~FF3x15y0(){ note_dtor("_ZN3ccc8FF3x15y0E", this);} // tgen
ccc::FF3x15y0 ::FF3x15y0(){ note_ctor("_ZN3ccc8FF3x15y0E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y0E, buf);
    ::ccc::FF3x15y0 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y0E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y0E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y0E);
    dp->::ccc::FF3x15y0::~FF3x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y0E(Test__ZN3ccc8FF3x15y0E, "_ZN3ccc8FF3x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y0C1Ev();
extern void _ZN3ccc8FF3x15y0D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y0E[] = {
  NSPAIR(_ZN3ccc8FF3x15y0C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y0E[];
extern void _ZN3ccc8FF3x15y03efgEv();
extern void _ZN3ccc8FF3x15y03pqrEv();
extern void _ZN3ccc8FF3x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y0E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y0E[] = {
  {&(_ZTVN3ccc8FF3x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y0E[];
Class_Descriptor cd__ZN3ccc8FF3x15y0E = {  "_ZN3ccc8FF3x15y0E", // class name
  bases__ZN3ccc8FF3x15y0E, 2,
  &(vtc__ZN3ccc8FF3x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y0E),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
namespace ccc { 
struct  FF3x15y1  : virtual ::ccc::EE3x15 {
  virtual void  abc(); // _ZN3ccc8FF3x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x15y13efgEv
  ~FF3x15y1(); // tgen
  FF3x15y1(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y1E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y13abcEv");}
void  ccc::FF3x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y13pqrEv");}
void  ccc::FF3x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y13efgEv");}
ccc::FF3x15y1 ::~FF3x15y1(){ note_dtor("_ZN3ccc8FF3x15y1E", this);} // tgen
ccc::FF3x15y1 ::FF3x15y1(){ note_ctor("_ZN3ccc8FF3x15y1E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y1E, buf);
    ::ccc::FF3x15y1 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y1E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y1E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y1E);
    dp->::ccc::FF3x15y1::~FF3x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y1E(Test__ZN3ccc8FF3x15y1E, "_ZN3ccc8FF3x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y1C1Ev();
extern void _ZN3ccc8FF3x15y1D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y1E[] = {
  NSPAIR(_ZN3ccc8FF3x15y1C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y1E[];
extern void _ZN3ccc8FF3x15y13efgEv();
extern void _ZN3ccc8FF3x15y13pqrEv();
extern void _ZN3ccc8FF3x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y1E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y1E[] = {
  {&(_ZTVN3ccc8FF3x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y1E[];
Class_Descriptor cd__ZN3ccc8FF3x15y1E = {  "_ZN3ccc8FF3x15y1E", // class name
  bases__ZN3ccc8FF3x15y1E, 2,
  &(vtc__ZN3ccc8FF3x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y1E),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
namespace ccc { 
struct  FF3x15y2  : virtual ::ccc::EE3x15 {
  virtual void  efg(); // _ZN3ccc8FF3x15y23efgEv
  virtual void  abc(); // _ZN3ccc8FF3x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y23pqrEv
  ~FF3x15y2(); // tgen
  FF3x15y2(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y2E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y23efgEv");}
void  ccc::FF3x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y23abcEv");}
void  ccc::FF3x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y23pqrEv");}
ccc::FF3x15y2 ::~FF3x15y2(){ note_dtor("_ZN3ccc8FF3x15y2E", this);} // tgen
ccc::FF3x15y2 ::FF3x15y2(){ note_ctor("_ZN3ccc8FF3x15y2E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y2E, buf);
    ::ccc::FF3x15y2 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y2E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y2E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y2E);
    dp->::ccc::FF3x15y2::~FF3x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y2E(Test__ZN3ccc8FF3x15y2E, "_ZN3ccc8FF3x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y2C1Ev();
extern void _ZN3ccc8FF3x15y2D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y2E[] = {
  NSPAIR(_ZN3ccc8FF3x15y2C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y2E[];
extern void _ZN3ccc8FF3x15y23efgEv();
extern void _ZN3ccc8FF3x15y23pqrEv();
extern void _ZN3ccc8FF3x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y2E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y2E[] = {
  {&(_ZTVN3ccc8FF3x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y2E[];
Class_Descriptor cd__ZN3ccc8FF3x15y2E = {  "_ZN3ccc8FF3x15y2E", // class name
  bases__ZN3ccc8FF3x15y2E, 2,
  &(vtc__ZN3ccc8FF3x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y2E),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
namespace ccc { 
struct  FF3x15y3  : virtual ::ccc::EE3x15 {
  virtual void  efg(); // _ZN3ccc8FF3x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x15y33abcEv
  ~FF3x15y3(); // tgen
  FF3x15y3(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y3E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y33efgEv");}
void  ccc::FF3x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y33pqrEv");}
void  ccc::FF3x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y33abcEv");}
ccc::FF3x15y3 ::~FF3x15y3(){ note_dtor("_ZN3ccc8FF3x15y3E", this);} // tgen
ccc::FF3x15y3 ::FF3x15y3(){ note_ctor("_ZN3ccc8FF3x15y3E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y3E, buf);
    ::ccc::FF3x15y3 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y3E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y3E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y3E);
    dp->::ccc::FF3x15y3::~FF3x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y3E(Test__ZN3ccc8FF3x15y3E, "_ZN3ccc8FF3x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y3C1Ev();
extern void _ZN3ccc8FF3x15y3D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y3E[] = {
  NSPAIR(_ZN3ccc8FF3x15y3C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y3E[];
extern void _ZN3ccc8FF3x15y33efgEv();
extern void _ZN3ccc8FF3x15y33pqrEv();
extern void _ZN3ccc8FF3x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y3E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y3E[] = {
  {&(_ZTVN3ccc8FF3x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y3E[];
Class_Descriptor cd__ZN3ccc8FF3x15y3E = {  "_ZN3ccc8FF3x15y3E", // class name
  bases__ZN3ccc8FF3x15y3E, 2,
  &(vtc__ZN3ccc8FF3x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y3E),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
namespace ccc { 
struct  FF3x15y4  : virtual ::ccc::EE3x15 {
  virtual void  pqr(); // _ZN3ccc8FF3x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF3x15y43abcEv
  virtual void  efg(); // _ZN3ccc8FF3x15y43efgEv
  ~FF3x15y4(); // tgen
  FF3x15y4(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y4E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y43pqrEv");}
void  ccc::FF3x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y43abcEv");}
void  ccc::FF3x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y43efgEv");}
ccc::FF3x15y4 ::~FF3x15y4(){ note_dtor("_ZN3ccc8FF3x15y4E", this);} // tgen
ccc::FF3x15y4 ::FF3x15y4(){ note_ctor("_ZN3ccc8FF3x15y4E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y4E, buf);
    ::ccc::FF3x15y4 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y4E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y4E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y4E);
    dp->::ccc::FF3x15y4::~FF3x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y4E(Test__ZN3ccc8FF3x15y4E, "_ZN3ccc8FF3x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y4C1Ev();
extern void _ZN3ccc8FF3x15y4D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y4E[] = {
  NSPAIR(_ZN3ccc8FF3x15y4C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y4E[];
extern void _ZN3ccc8FF3x15y43efgEv();
extern void _ZN3ccc8FF3x15y43pqrEv();
extern void _ZN3ccc8FF3x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y4E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y4E[] = {
  {&(_ZTVN3ccc8FF3x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y4E[];
Class_Descriptor cd__ZN3ccc8FF3x15y4E = {  "_ZN3ccc8FF3x15y4E", // class name
  bases__ZN3ccc8FF3x15y4E, 2,
  &(vtc__ZN3ccc8FF3x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y4E),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
namespace ccc { 
struct  FF3x15y5  : virtual ::ccc::EE3x15 {
  virtual void  pqr(); // _ZN3ccc8FF3x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF3x15y53efgEv
  virtual void  abc(); // _ZN3ccc8FF3x15y53abcEv
  ~FF3x15y5(); // tgen
  FF3x15y5(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y5E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF3x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y53pqrEv");}
void  ccc::FF3x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y53efgEv");}
void  ccc::FF3x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y53abcEv");}
ccc::FF3x15y5 ::~FF3x15y5(){ note_dtor("_ZN3ccc8FF3x15y5E", this);} // tgen
ccc::FF3x15y5 ::FF3x15y5(){ note_ctor("_ZN3ccc8FF3x15y5E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y5E, buf);
    ::ccc::FF3x15y5 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y5E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y5E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y5E);
    dp->::ccc::FF3x15y5::~FF3x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y5E(Test__ZN3ccc8FF3x15y5E, "_ZN3ccc8FF3x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y5C1Ev();
extern void _ZN3ccc8FF3x15y5D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y5E[] = {
  NSPAIR(_ZN3ccc8FF3x15y5C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y5E[];
extern void _ZN3ccc8FF3x15y53efgEv();
extern void _ZN3ccc8FF3x15y53pqrEv();
extern void _ZN3ccc8FF3x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y5E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y5E[] = {
  {&(_ZTVN3ccc8FF3x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y5E[];
Class_Descriptor cd__ZN3ccc8FF3x15y5E = {  "_ZN3ccc8FF3x15y5E", // class name
  bases__ZN3ccc8FF3x15y5E, 2,
  &(vtc__ZN3ccc8FF3x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y5E),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
namespace ccc { 
struct  FF3x15y6  : virtual ::ccc::EE3x15 {
  virtual void  abc(); // _ZN3ccc8FF3x15y63abcEv
  virtual void  efg(); // _ZN3ccc8FF3x15y63efgEv
  ~FF3x15y6(); // tgen
  FF3x15y6(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y6E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y63abcEv");}
void  ccc::FF3x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y63efgEv");}
ccc::FF3x15y6 ::~FF3x15y6(){ note_dtor("_ZN3ccc8FF3x15y6E", this);} // tgen
ccc::FF3x15y6 ::FF3x15y6(){ note_ctor("_ZN3ccc8FF3x15y6E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y6E, buf);
    ::ccc::FF3x15y6 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y6E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y6E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y6E);
    dp->::ccc::FF3x15y6::~FF3x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y6E(Test__ZN3ccc8FF3x15y6E, "_ZN3ccc8FF3x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y6C1Ev();
extern void _ZN3ccc8FF3x15y6D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y6E[] = {
  NSPAIR(_ZN3ccc8FF3x15y6C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y6E[];
extern void _ZN3ccc8FF3x15y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y6E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y6E[] = {
  {&(_ZTVN3ccc8FF3x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y6E[];
Class_Descriptor cd__ZN3ccc8FF3x15y6E = {  "_ZN3ccc8FF3x15y6E", // class name
  bases__ZN3ccc8FF3x15y6E, 2,
  &(vtc__ZN3ccc8FF3x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y6E),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
namespace ccc { 
struct  FF3x15y7  : virtual ::ccc::EE3x15 {
  virtual void  abc(); // _ZN3ccc8FF3x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y73pqrEv
  ~FF3x15y7(); // tgen
  FF3x15y7(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y7E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y73abcEv");}
void  ccc::FF3x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y73pqrEv");}
ccc::FF3x15y7 ::~FF3x15y7(){ note_dtor("_ZN3ccc8FF3x15y7E", this);} // tgen
ccc::FF3x15y7 ::FF3x15y7(){ note_ctor("_ZN3ccc8FF3x15y7E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y7E, buf);
    ::ccc::FF3x15y7 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y7E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y7E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y7E);
    dp->::ccc::FF3x15y7::~FF3x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y7E(Test__ZN3ccc8FF3x15y7E, "_ZN3ccc8FF3x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y7C1Ev();
extern void _ZN3ccc8FF3x15y7D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y7E[] = {
  NSPAIR(_ZN3ccc8FF3x15y7C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8FF3x15y73pqrEv();
extern void _ZN3ccc8FF3x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y7E[] = {
  {&(_ZTVN3ccc8FF3x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y7E[];
Class_Descriptor cd__ZN3ccc8FF3x15y7E = {  "_ZN3ccc8FF3x15y7E", // class name
  bases__ZN3ccc8FF3x15y7E, 2,
  &(vtc__ZN3ccc8FF3x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y7E),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
namespace ccc { 
struct  FF3x15y8  : virtual ::ccc::EE3x15 {
  virtual void  efg(); // _ZN3ccc8FF3x15y83efgEv
  virtual void  abc(); // _ZN3ccc8FF3x15y83abcEv
  ~FF3x15y8(); // tgen
  FF3x15y8(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y8E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y83efgEv");}
void  ccc::FF3x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF3x15y83abcEv");}
ccc::FF3x15y8 ::~FF3x15y8(){ note_dtor("_ZN3ccc8FF3x15y8E", this);} // tgen
ccc::FF3x15y8 ::FF3x15y8(){ note_ctor("_ZN3ccc8FF3x15y8E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y8E, buf);
    ::ccc::FF3x15y8 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y8E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y8E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y8E);
    dp->::ccc::FF3x15y8::~FF3x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y8E(Test__ZN3ccc8FF3x15y8E, "_ZN3ccc8FF3x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y8C1Ev();
extern void _ZN3ccc8FF3x15y8D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y8E[] = {
  NSPAIR(_ZN3ccc8FF3x15y8C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y8E[];
extern void _ZN3ccc8FF3x15y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8FF3x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y8E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y8E[] = {
  {&(_ZTVN3ccc8FF3x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y8E[];
Class_Descriptor cd__ZN3ccc8FF3x15y8E = {  "_ZN3ccc8FF3x15y8E", // class name
  bases__ZN3ccc8FF3x15y8E, 2,
  &(vtc__ZN3ccc8FF3x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y8E),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
namespace ccc { 
struct  FF3x15y9  : virtual ::ccc::EE3x15 {
  virtual void  efg(); // _ZN3ccc8FF3x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF3x15y93pqrEv
  ~FF3x15y9(); // tgen
  FF3x15y9(); // tgen
};
//SIG(1 _ZN3ccc8FF3x15y9E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF3x15y93efgEv");}
void  ccc::FF3x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF3x15y93pqrEv");}
ccc::FF3x15y9 ::~FF3x15y9(){ note_dtor("_ZN3ccc8FF3x15y9E", this);} // tgen
ccc::FF3x15y9 ::FF3x15y9(){ note_ctor("_ZN3ccc8FF3x15y9E", this);} // tgen
}
static void Test__ZN3ccc8FF3x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF3x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF3x15y9E, buf);
    ::ccc::FF3x15y9 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF3x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF3x15y9E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y9E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc8FF3x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF3x15y9E);
    dp->::ccc::FF3x15y9::~FF3x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF3x15y9E(Test__ZN3ccc8FF3x15y9E, "_ZN3ccc8FF3x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF3x15y9C1Ev();
extern void _ZN3ccc8FF3x15y9D1Ev();
Name_Map name_map__ZN3ccc8FF3x15y9E[] = {
  NSPAIR(_ZN3ccc8FF3x15y9C1Ev),
  NSPAIR(_ZN3ccc8FF3x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc8FF3x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y9E[];
extern void _ZN3ccc8FF3x15y93efgEv();
extern void _ZN3ccc8FF3x15y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF3x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF3x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8FF3x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF3x15y9E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF3x15y9E[] = {
  {&(_ZTVN3ccc8FF3x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF3x15y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_8FF3x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF3x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF3x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF3x15y9E[];
Class_Descriptor cd__ZN3ccc8FF3x15y9E = {  "_ZN3ccc8FF3x15y9E", // class name
  bases__ZN3ccc8FF3x15y9E, 2,
  &(vtc__ZN3ccc8FF3x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF3x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF3x15y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF3x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF3x15y9E),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
namespace ccc { 
struct  FF3x15y10  : virtual ::ccc::EE3x15 {
  virtual void  pqr(); // _ZN3ccc9FF3x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF3x15y103abcEv
  ~FF3x15y10(); // tgen
  FF3x15y10(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y10E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x15y103pqrEv");}
void  ccc::FF3x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x15y103abcEv");}
ccc::FF3x15y10 ::~FF3x15y10(){ note_dtor("_ZN3ccc9FF3x15y10E", this);} // tgen
ccc::FF3x15y10 ::FF3x15y10(){ note_ctor("_ZN3ccc9FF3x15y10E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y10E, buf);
    ::ccc::FF3x15y10 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y10E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y10E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y10E);
    dp->::ccc::FF3x15y10::~FF3x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y10E(Test__ZN3ccc9FF3x15y10E, "_ZN3ccc9FF3x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y10C1Ev();
extern void _ZN3ccc9FF3x15y10D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y10E[] = {
  NSPAIR(_ZN3ccc9FF3x15y10C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x15y103pqrEv();
extern void _ZN3ccc9FF3x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y10E[] = {
  {&(_ZTVN3ccc9FF3x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y10E[];
Class_Descriptor cd__ZN3ccc9FF3x15y10E = {  "_ZN3ccc9FF3x15y10E", // class name
  bases__ZN3ccc9FF3x15y10E, 2,
  &(vtc__ZN3ccc9FF3x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y10E),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
namespace ccc { 
struct  FF3x15y11  : virtual ::ccc::EE3x15 {
  virtual void  pqr(); // _ZN3ccc9FF3x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF3x15y113efgEv
  ~FF3x15y11(); // tgen
  FF3x15y11(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y11E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF3x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x15y113pqrEv");}
void  ccc::FF3x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x15y113efgEv");}
ccc::FF3x15y11 ::~FF3x15y11(){ note_dtor("_ZN3ccc9FF3x15y11E", this);} // tgen
ccc::FF3x15y11 ::FF3x15y11(){ note_ctor("_ZN3ccc9FF3x15y11E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y11E, buf);
    ::ccc::FF3x15y11 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y11E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y11E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y11E);
    dp->::ccc::FF3x15y11::~FF3x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y11E(Test__ZN3ccc9FF3x15y11E, "_ZN3ccc9FF3x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y11C1Ev();
extern void _ZN3ccc9FF3x15y11D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y11E[] = {
  NSPAIR(_ZN3ccc9FF3x15y11C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y11E[];
extern void _ZN3ccc9FF3x15y113efgEv();
extern void _ZN3ccc9FF3x15y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y11E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y11E[] = {
  {&(_ZTVN3ccc9FF3x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y11E[];
Class_Descriptor cd__ZN3ccc9FF3x15y11E = {  "_ZN3ccc9FF3x15y11E", // class name
  bases__ZN3ccc9FF3x15y11E, 2,
  &(vtc__ZN3ccc9FF3x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y11E),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
namespace ccc { 
struct  FF3x15y12  : virtual ::ccc::EE3x15 {
  virtual void  abc(); // _ZN3ccc9FF3x15y123abcEv
  ~FF3x15y12(); // tgen
  FF3x15y12(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y12E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1}
}
namespace ccc { 
void  ccc::FF3x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF3x15y123abcEv");}
ccc::FF3x15y12 ::~FF3x15y12(){ note_dtor("_ZN3ccc9FF3x15y12E", this);} // tgen
ccc::FF3x15y12 ::FF3x15y12(){ note_ctor("_ZN3ccc9FF3x15y12E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y12E, buf);
    ::ccc::FF3x15y12 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y12E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y12E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y12E);
    dp->::ccc::FF3x15y12::~FF3x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y12E(Test__ZN3ccc9FF3x15y12E, "_ZN3ccc9FF3x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y12C1Ev();
extern void _ZN3ccc9FF3x15y12D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y12E[] = {
  NSPAIR(_ZN3ccc9FF3x15y12C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9FF3x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y12E[] = {
  {&(_ZTVN3ccc9FF3x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y12E[];
Class_Descriptor cd__ZN3ccc9FF3x15y12E = {  "_ZN3ccc9FF3x15y12E", // class name
  bases__ZN3ccc9FF3x15y12E, 2,
  &(vtc__ZN3ccc9FF3x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y12E),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
namespace ccc { 
struct  FF3x15y13  : virtual ::ccc::EE3x15 {
  virtual void  efg(); // _ZN3ccc9FF3x15y133efgEv
  ~FF3x15y13(); // tgen
  FF3x15y13(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y13E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1}
}
namespace ccc { 
void  ccc::FF3x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF3x15y133efgEv");}
ccc::FF3x15y13 ::~FF3x15y13(){ note_dtor("_ZN3ccc9FF3x15y13E", this);} // tgen
ccc::FF3x15y13 ::FF3x15y13(){ note_ctor("_ZN3ccc9FF3x15y13E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y13E, buf);
    ::ccc::FF3x15y13 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y13E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y13E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y13E);
    dp->::ccc::FF3x15y13::~FF3x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y13E(Test__ZN3ccc9FF3x15y13E, "_ZN3ccc9FF3x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y13C1Ev();
extern void _ZN3ccc9FF3x15y13D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y13E[] = {
  NSPAIR(_ZN3ccc9FF3x15y13C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y13E[];
extern void _ZN3ccc9FF3x15y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y13E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y13E[] = {
  {&(_ZTVN3ccc9FF3x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y13E[];
Class_Descriptor cd__ZN3ccc9FF3x15y13E = {  "_ZN3ccc9FF3x15y13E", // class name
  bases__ZN3ccc9FF3x15y13E, 2,
  &(vtc__ZN3ccc9FF3x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y13E),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
namespace ccc { 
struct  FF3x15y14  : virtual ::ccc::EE3x15 {
  virtual void  pqr(); // _ZN3ccc9FF3x15y143pqrEv
  ~FF3x15y14(); // tgen
  FF3x15y14(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y14E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1}
}
namespace ccc { 
void  ccc::FF3x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF3x15y143pqrEv");}
ccc::FF3x15y14 ::~FF3x15y14(){ note_dtor("_ZN3ccc9FF3x15y14E", this);} // tgen
ccc::FF3x15y14 ::FF3x15y14(){ note_ctor("_ZN3ccc9FF3x15y14E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y14E, buf);
    ::ccc::FF3x15y14 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y14E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y14E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y14E);
    dp->::ccc::FF3x15y14::~FF3x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y14E(Test__ZN3ccc9FF3x15y14E, "_ZN3ccc9FF3x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y14C1Ev();
extern void _ZN3ccc9FF3x15y14D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y14E[] = {
  NSPAIR(_ZN3ccc9FF3x15y14C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9FF3x15y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9FF3x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y14E[] = {
  {&(_ZTVN3ccc9FF3x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y14E[];
Class_Descriptor cd__ZN3ccc9FF3x15y14E = {  "_ZN3ccc9FF3x15y14E", // class name
  bases__ZN3ccc9FF3x15y14E, 2,
  &(vtc__ZN3ccc9FF3x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y14E),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
namespace ccc { 
struct  FF3x15y15  : virtual ::ccc::EE3x15 {
  ~FF3x15y15(); // tgen
  FF3x15y15(); // tgen
};
//SIG(1 _ZN3ccc9FF3x15y15E) C1{ VBC2{ VBC3{ v1 v2 v3}}}
}
namespace ccc { 
ccc::FF3x15y15 ::~FF3x15y15(){ note_dtor("_ZN3ccc9FF3x15y15E", this);} // tgen
ccc::FF3x15y15 ::FF3x15y15(){ note_ctor("_ZN3ccc9FF3x15y15E", this);} // tgen
}
static void Test__ZN3ccc9FF3x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF3x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF3x15y15E, buf);
    ::ccc::FF3x15y15 *dp, &lv = *(dp=new (buf) ::ccc::FF3x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF3x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF3x15y15E)");
    check_base_class_offset(lv, (::ccc::AA3*)(::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y15E");
    check_base_class_offset(lv, (::ccc::EE3x15*), 0, "_ZN3ccc9FF3x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF3x15y15E);
    dp->::ccc::FF3x15y15::~FF3x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF3x15y15E(Test__ZN3ccc9FF3x15y15E, "_ZN3ccc9FF3x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF3x15y15C1Ev();
extern void _ZN3ccc9FF3x15y15D1Ev();
Name_Map name_map__ZN3ccc9FF3x15y15E[] = {
  NSPAIR(_ZN3ccc9FF3x15y15C1Ev),
  NSPAIR(_ZN3ccc9FF3x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc6EE3x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE3x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE3x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE3x15E[];
static Base_Class bases__ZN3ccc9FF3x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE3x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF3x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF3x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF3x15y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE3x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF3x15y15E[] = {
  {&(_ZTVN3ccc9FF3x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF3x15y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE3x15E__NS_9FF3x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF3x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF3x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF3x15y15E[];
Class_Descriptor cd__ZN3ccc9FF3x15y15E = {  "_ZN3ccc9FF3x15y15E", // class name
  bases__ZN3ccc9FF3x15y15E, 2,
  &(vtc__ZN3ccc9FF3x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF3x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF3x15y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF3x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF3x15y15E),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
namespace ccc { 
struct  FF4x0y0  : virtual ::ccc::EE4x0 {
  virtual void  abc(); // _ZN3ccc7FF4x0y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y03pqrEv
  ~FF4x0y0(); // tgen
  FF4x0y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y03abcEv");}
void  ccc::FF4x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y03efgEv");}
void  ccc::FF4x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y03pqrEv");}
ccc::FF4x0y0 ::~FF4x0y0(){ note_dtor("_ZN3ccc7FF4x0y0E", this);} // tgen
ccc::FF4x0y0 ::FF4x0y0(){ note_ctor("_ZN3ccc7FF4x0y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y0E, buf);
    ::ccc::FF4x0y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y0E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y0E);
    dp->::ccc::FF4x0y0::~FF4x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y0E(Test__ZN3ccc7FF4x0y0E, "_ZN3ccc7FF4x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y0C1Ev();
extern void _ZN3ccc7FF4x0y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y0E[] = {
  NSPAIR(_ZN3ccc7FF4x0y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y0E[];
extern void _ZN3ccc7FF4x0y03pqrEv();
extern void _ZN3ccc7FF4x0y03abcEv();
extern void _ZN3ccc7FF4x0y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y0E[] = {
  {&(_ZTVN3ccc7FF4x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y0E[];
static VTBL_ENTRY alt_thunk_names961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y0E = {  "_ZN3ccc7FF4x0y0E", // class name
  bases__ZN3ccc7FF4x0y0E, 2,
  &(vtc__ZN3ccc7FF4x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names961,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y1  : virtual ::ccc::EE4x0 {
  virtual void  abc(); // _ZN3ccc7FF4x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x0y13efgEv
  ~FF4x0y1(); // tgen
  FF4x0y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y13abcEv");}
void  ccc::FF4x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y13pqrEv");}
void  ccc::FF4x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y13efgEv");}
ccc::FF4x0y1 ::~FF4x0y1(){ note_dtor("_ZN3ccc7FF4x0y1E", this);} // tgen
ccc::FF4x0y1 ::FF4x0y1(){ note_ctor("_ZN3ccc7FF4x0y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y1E, buf);
    ::ccc::FF4x0y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y1E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y1E);
    dp->::ccc::FF4x0y1::~FF4x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y1E(Test__ZN3ccc7FF4x0y1E, "_ZN3ccc7FF4x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y1C1Ev();
extern void _ZN3ccc7FF4x0y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y1E[] = {
  NSPAIR(_ZN3ccc7FF4x0y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y1E[];
extern void _ZN3ccc7FF4x0y13pqrEv();
extern void _ZN3ccc7FF4x0y13abcEv();
extern void _ZN3ccc7FF4x0y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y1E[] = {
  {&(_ZTVN3ccc7FF4x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y1E[];
static VTBL_ENTRY alt_thunk_names962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y1E = {  "_ZN3ccc7FF4x0y1E", // class name
  bases__ZN3ccc7FF4x0y1E, 2,
  &(vtc__ZN3ccc7FF4x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names962,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y2  : virtual ::ccc::EE4x0 {
  virtual void  efg(); // _ZN3ccc7FF4x0y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y23pqrEv
  ~FF4x0y2(); // tgen
  FF4x0y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y23efgEv");}
void  ccc::FF4x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y23abcEv");}
void  ccc::FF4x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y23pqrEv");}
ccc::FF4x0y2 ::~FF4x0y2(){ note_dtor("_ZN3ccc7FF4x0y2E", this);} // tgen
ccc::FF4x0y2 ::FF4x0y2(){ note_ctor("_ZN3ccc7FF4x0y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y2E, buf);
    ::ccc::FF4x0y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y2E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y2E);
    dp->::ccc::FF4x0y2::~FF4x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y2E(Test__ZN3ccc7FF4x0y2E, "_ZN3ccc7FF4x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y2C1Ev();
extern void _ZN3ccc7FF4x0y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y2E[] = {
  NSPAIR(_ZN3ccc7FF4x0y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y2E[];
extern void _ZN3ccc7FF4x0y23pqrEv();
extern void _ZN3ccc7FF4x0y23abcEv();
extern void _ZN3ccc7FF4x0y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y2E[] = {
  {&(_ZTVN3ccc7FF4x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y2E[];
static VTBL_ENTRY alt_thunk_names963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y2E = {  "_ZN3ccc7FF4x0y2E", // class name
  bases__ZN3ccc7FF4x0y2E, 2,
  &(vtc__ZN3ccc7FF4x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names963,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y3  : virtual ::ccc::EE4x0 {
  virtual void  efg(); // _ZN3ccc7FF4x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x0y33abcEv
  ~FF4x0y3(); // tgen
  FF4x0y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y33efgEv");}
void  ccc::FF4x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y33pqrEv");}
void  ccc::FF4x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y33abcEv");}
ccc::FF4x0y3 ::~FF4x0y3(){ note_dtor("_ZN3ccc7FF4x0y3E", this);} // tgen
ccc::FF4x0y3 ::FF4x0y3(){ note_ctor("_ZN3ccc7FF4x0y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y3E, buf);
    ::ccc::FF4x0y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y3E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y3E);
    dp->::ccc::FF4x0y3::~FF4x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y3E(Test__ZN3ccc7FF4x0y3E, "_ZN3ccc7FF4x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y3C1Ev();
extern void _ZN3ccc7FF4x0y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y3E[] = {
  NSPAIR(_ZN3ccc7FF4x0y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y3E[];
extern void _ZN3ccc7FF4x0y33pqrEv();
extern void _ZN3ccc7FF4x0y33abcEv();
extern void _ZN3ccc7FF4x0y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y3E[] = {
  {&(_ZTVN3ccc7FF4x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y3E[];
static VTBL_ENTRY alt_thunk_names964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y3E = {  "_ZN3ccc7FF4x0y3E", // class name
  bases__ZN3ccc7FF4x0y3E, 2,
  &(vtc__ZN3ccc7FF4x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names964,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y4  : virtual ::ccc::EE4x0 {
  virtual void  pqr(); // _ZN3ccc7FF4x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x0y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x0y43efgEv
  ~FF4x0y4(); // tgen
  FF4x0y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y43pqrEv");}
void  ccc::FF4x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y43abcEv");}
void  ccc::FF4x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y43efgEv");}
ccc::FF4x0y4 ::~FF4x0y4(){ note_dtor("_ZN3ccc7FF4x0y4E", this);} // tgen
ccc::FF4x0y4 ::FF4x0y4(){ note_ctor("_ZN3ccc7FF4x0y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y4E, buf);
    ::ccc::FF4x0y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y4E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y4E);
    dp->::ccc::FF4x0y4::~FF4x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y4E(Test__ZN3ccc7FF4x0y4E, "_ZN3ccc7FF4x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y4C1Ev();
extern void _ZN3ccc7FF4x0y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y4E[] = {
  NSPAIR(_ZN3ccc7FF4x0y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y4E[];
extern void _ZN3ccc7FF4x0y43pqrEv();
extern void _ZN3ccc7FF4x0y43abcEv();
extern void _ZN3ccc7FF4x0y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y4E[] = {
  {&(_ZTVN3ccc7FF4x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y4E[];
static VTBL_ENTRY alt_thunk_names965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y4E = {  "_ZN3ccc7FF4x0y4E", // class name
  bases__ZN3ccc7FF4x0y4E, 2,
  &(vtc__ZN3ccc7FF4x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names965,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y5  : virtual ::ccc::EE4x0 {
  virtual void  pqr(); // _ZN3ccc7FF4x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x0y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x0y53abcEv
  ~FF4x0y5(); // tgen
  FF4x0y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y53pqrEv");}
void  ccc::FF4x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y53efgEv");}
void  ccc::FF4x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y53abcEv");}
ccc::FF4x0y5 ::~FF4x0y5(){ note_dtor("_ZN3ccc7FF4x0y5E", this);} // tgen
ccc::FF4x0y5 ::FF4x0y5(){ note_ctor("_ZN3ccc7FF4x0y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y5E, buf);
    ::ccc::FF4x0y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y5E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y5E);
    dp->::ccc::FF4x0y5::~FF4x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y5E(Test__ZN3ccc7FF4x0y5E, "_ZN3ccc7FF4x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y5C1Ev();
extern void _ZN3ccc7FF4x0y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y5E[] = {
  NSPAIR(_ZN3ccc7FF4x0y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y5E[];
extern void _ZN3ccc7FF4x0y53pqrEv();
extern void _ZN3ccc7FF4x0y53abcEv();
extern void _ZN3ccc7FF4x0y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y5E[] = {
  {&(_ZTVN3ccc7FF4x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y5E[];
static VTBL_ENTRY alt_thunk_names966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y5E = {  "_ZN3ccc7FF4x0y5E", // class name
  bases__ZN3ccc7FF4x0y5E, 2,
  &(vtc__ZN3ccc7FF4x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names966,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y6  : virtual ::ccc::EE4x0 {
  virtual void  abc(); // _ZN3ccc7FF4x0y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x0y63efgEv
  ~FF4x0y6(); // tgen
  FF4x0y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y63abcEv");}
void  ccc::FF4x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y63efgEv");}
ccc::FF4x0y6 ::~FF4x0y6(){ note_dtor("_ZN3ccc7FF4x0y6E", this);} // tgen
ccc::FF4x0y6 ::FF4x0y6(){ note_ctor("_ZN3ccc7FF4x0y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y6E, buf);
    ::ccc::FF4x0y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y6E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y6E);
    dp->::ccc::FF4x0y6::~FF4x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y6E(Test__ZN3ccc7FF4x0y6E, "_ZN3ccc7FF4x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y6C1Ev();
extern void _ZN3ccc7FF4x0y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y6E[] = {
  NSPAIR(_ZN3ccc7FF4x0y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x0y63abcEv();
extern void _ZN3ccc7FF4x0y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y6E[] = {
  {&(_ZTVN3ccc7FF4x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y6E[];
static VTBL_ENTRY alt_thunk_names967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y6E = {  "_ZN3ccc7FF4x0y6E", // class name
  bases__ZN3ccc7FF4x0y6E, 2,
  &(vtc__ZN3ccc7FF4x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names967,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y7  : virtual ::ccc::EE4x0 {
  virtual void  abc(); // _ZN3ccc7FF4x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y73pqrEv
  ~FF4x0y7(); // tgen
  FF4x0y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y73abcEv");}
void  ccc::FF4x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y73pqrEv");}
ccc::FF4x0y7 ::~FF4x0y7(){ note_dtor("_ZN3ccc7FF4x0y7E", this);} // tgen
ccc::FF4x0y7 ::FF4x0y7(){ note_ctor("_ZN3ccc7FF4x0y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y7E, buf);
    ::ccc::FF4x0y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y7E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y7E);
    dp->::ccc::FF4x0y7::~FF4x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y7E(Test__ZN3ccc7FF4x0y7E, "_ZN3ccc7FF4x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y7C1Ev();
extern void _ZN3ccc7FF4x0y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y7E[] = {
  NSPAIR(_ZN3ccc7FF4x0y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y7E[];
extern void _ZN3ccc7FF4x0y73pqrEv();
extern void _ZN3ccc7FF4x0y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y7E[] = {
  {&(_ZTVN3ccc7FF4x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y7E[];
static VTBL_ENTRY alt_thunk_names968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y7E = {  "_ZN3ccc7FF4x0y7E", // class name
  bases__ZN3ccc7FF4x0y7E, 2,
  &(vtc__ZN3ccc7FF4x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names968,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y8  : virtual ::ccc::EE4x0 {
  virtual void  efg(); // _ZN3ccc7FF4x0y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x0y83abcEv
  ~FF4x0y8(); // tgen
  FF4x0y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y83efgEv");}
void  ccc::FF4x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x0y83abcEv");}
ccc::FF4x0y8 ::~FF4x0y8(){ note_dtor("_ZN3ccc7FF4x0y8E", this);} // tgen
ccc::FF4x0y8 ::FF4x0y8(){ note_ctor("_ZN3ccc7FF4x0y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y8E, buf);
    ::ccc::FF4x0y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y8E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y8E);
    dp->::ccc::FF4x0y8::~FF4x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y8E(Test__ZN3ccc7FF4x0y8E, "_ZN3ccc7FF4x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y8C1Ev();
extern void _ZN3ccc7FF4x0y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y8E[] = {
  NSPAIR(_ZN3ccc7FF4x0y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x0y83abcEv();
extern void _ZN3ccc7FF4x0y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y8E[] = {
  {&(_ZTVN3ccc7FF4x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y8E[];
static VTBL_ENTRY alt_thunk_names969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y8E = {  "_ZN3ccc7FF4x0y8E", // class name
  bases__ZN3ccc7FF4x0y8E, 2,
  &(vtc__ZN3ccc7FF4x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names969,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y9  : virtual ::ccc::EE4x0 {
  virtual void  efg(); // _ZN3ccc7FF4x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x0y93pqrEv
  ~FF4x0y9(); // tgen
  FF4x0y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x0y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x0y93efgEv");}
void  ccc::FF4x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x0y93pqrEv");}
ccc::FF4x0y9 ::~FF4x0y9(){ note_dtor("_ZN3ccc7FF4x0y9E", this);} // tgen
ccc::FF4x0y9 ::FF4x0y9(){ note_ctor("_ZN3ccc7FF4x0y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x0y9E, buf);
    ::ccc::FF4x0y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x0y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y9E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc7FF4x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x0y9E);
    dp->::ccc::FF4x0y9::~FF4x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x0y9E(Test__ZN3ccc7FF4x0y9E, "_ZN3ccc7FF4x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x0y9C1Ev();
extern void _ZN3ccc7FF4x0y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x0y9E[] = {
  NSPAIR(_ZN3ccc7FF4x0y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc7FF4x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y9E[];
extern void _ZN3ccc7FF4x0y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x0y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x0y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x0y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x0y9E[] = {
  {&(_ZTVN3ccc7FF4x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x0y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_7FF4x0y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x0y9E[];
static VTBL_ENTRY alt_thunk_names970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x0y9E = {  "_ZN3ccc7FF4x0y9E", // class name
  bases__ZN3ccc7FF4x0y9E, 2,
  &(vtc__ZN3ccc7FF4x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x0y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x0y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x0y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x0y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names970,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y10  : virtual ::ccc::EE4x0 {
  virtual void  pqr(); // _ZN3ccc8FF4x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x0y103abcEv
  ~FF4x0y10(); // tgen
  FF4x0y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x0y103pqrEv");}
void  ccc::FF4x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x0y103abcEv");}
ccc::FF4x0y10 ::~FF4x0y10(){ note_dtor("_ZN3ccc8FF4x0y10E", this);} // tgen
ccc::FF4x0y10 ::FF4x0y10(){ note_ctor("_ZN3ccc8FF4x0y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y10E, buf);
    ::ccc::FF4x0y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y10E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y10E);
    dp->::ccc::FF4x0y10::~FF4x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y10E(Test__ZN3ccc8FF4x0y10E, "_ZN3ccc8FF4x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y10C1Ev();
extern void _ZN3ccc8FF4x0y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y10E[] = {
  NSPAIR(_ZN3ccc8FF4x0y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y10E[];
extern void _ZN3ccc8FF4x0y103pqrEv();
extern void _ZN3ccc8FF4x0y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y10E[] = {
  {&(_ZTVN3ccc8FF4x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y10E[];
static VTBL_ENTRY alt_thunk_names971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y10E = {  "_ZN3ccc8FF4x0y10E", // class name
  bases__ZN3ccc8FF4x0y10E, 2,
  &(vtc__ZN3ccc8FF4x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names971,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y11  : virtual ::ccc::EE4x0 {
  virtual void  pqr(); // _ZN3ccc8FF4x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x0y113efgEv
  ~FF4x0y11(); // tgen
  FF4x0y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x0y113pqrEv");}
void  ccc::FF4x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x0y113efgEv");}
ccc::FF4x0y11 ::~FF4x0y11(){ note_dtor("_ZN3ccc8FF4x0y11E", this);} // tgen
ccc::FF4x0y11 ::FF4x0y11(){ note_ctor("_ZN3ccc8FF4x0y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y11E, buf);
    ::ccc::FF4x0y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y11E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y11E);
    dp->::ccc::FF4x0y11::~FF4x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y11E(Test__ZN3ccc8FF4x0y11E, "_ZN3ccc8FF4x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y11C1Ev();
extern void _ZN3ccc8FF4x0y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y11E[] = {
  NSPAIR(_ZN3ccc8FF4x0y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y11E[];
extern void _ZN3ccc8FF4x0y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x0y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y11E[] = {
  {&(_ZTVN3ccc8FF4x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y11E[];
static VTBL_ENTRY alt_thunk_names972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y11E = {  "_ZN3ccc8FF4x0y11E", // class name
  bases__ZN3ccc8FF4x0y11E, 2,
  &(vtc__ZN3ccc8FF4x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names972,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y12  : virtual ::ccc::EE4x0 {
  virtual void  abc(); // _ZN3ccc8FF4x0y123abcEv
  ~FF4x0y12(); // tgen
  FF4x0y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x0y123abcEv");}
ccc::FF4x0y12 ::~FF4x0y12(){ note_dtor("_ZN3ccc8FF4x0y12E", this);} // tgen
ccc::FF4x0y12 ::FF4x0y12(){ note_ctor("_ZN3ccc8FF4x0y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y12E, buf);
    ::ccc::FF4x0y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y12E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y12E);
    dp->::ccc::FF4x0y12::~FF4x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y12E(Test__ZN3ccc8FF4x0y12E, "_ZN3ccc8FF4x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y12C1Ev();
extern void _ZN3ccc8FF4x0y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y12E[] = {
  NSPAIR(_ZN3ccc8FF4x0y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x0y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y12E[] = {
  {&(_ZTVN3ccc8FF4x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y12E[];
static VTBL_ENTRY alt_thunk_names973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y12E = {  "_ZN3ccc8FF4x0y12E", // class name
  bases__ZN3ccc8FF4x0y12E, 2,
  &(vtc__ZN3ccc8FF4x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names973,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y13  : virtual ::ccc::EE4x0 {
  virtual void  efg(); // _ZN3ccc8FF4x0y133efgEv
  ~FF4x0y13(); // tgen
  FF4x0y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x0y133efgEv");}
ccc::FF4x0y13 ::~FF4x0y13(){ note_dtor("_ZN3ccc8FF4x0y13E", this);} // tgen
ccc::FF4x0y13 ::FF4x0y13(){ note_ctor("_ZN3ccc8FF4x0y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y13E, buf);
    ::ccc::FF4x0y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y13E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y13E);
    dp->::ccc::FF4x0y13::~FF4x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y13E(Test__ZN3ccc8FF4x0y13E, "_ZN3ccc8FF4x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y13C1Ev();
extern void _ZN3ccc8FF4x0y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y13E[] = {
  NSPAIR(_ZN3ccc8FF4x0y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x0y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y13E[] = {
  {&(_ZTVN3ccc8FF4x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y13E[];
static VTBL_ENTRY alt_thunk_names974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y13E = {  "_ZN3ccc8FF4x0y13E", // class name
  bases__ZN3ccc8FF4x0y13E, 2,
  &(vtc__ZN3ccc8FF4x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names974,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y14  : virtual ::ccc::EE4x0 {
  virtual void  pqr(); // _ZN3ccc8FF4x0y143pqrEv
  ~FF4x0y14(); // tgen
  FF4x0y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x0y143pqrEv");}
ccc::FF4x0y14 ::~FF4x0y14(){ note_dtor("_ZN3ccc8FF4x0y14E", this);} // tgen
ccc::FF4x0y14 ::FF4x0y14(){ note_ctor("_ZN3ccc8FF4x0y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y14E, buf);
    ::ccc::FF4x0y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y14E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y14E);
    dp->::ccc::FF4x0y14::~FF4x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y14E(Test__ZN3ccc8FF4x0y14E, "_ZN3ccc8FF4x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y14C1Ev();
extern void _ZN3ccc8FF4x0y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y14E[] = {
  NSPAIR(_ZN3ccc8FF4x0y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y14E[];
extern void _ZN3ccc8FF4x0y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x0y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y14E[] = {
  {&(_ZTVN3ccc8FF4x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y14E[];
static VTBL_ENTRY alt_thunk_names975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y14E = {  "_ZN3ccc8FF4x0y14E", // class name
  bases__ZN3ccc8FF4x0y14E, 2,
  &(vtc__ZN3ccc8FF4x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names975,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x0y15  : virtual ::ccc::EE4x0 {
  ~FF4x0y15(); // tgen
  FF4x0y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x0y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x0y15 ::~FF4x0y15(){ note_dtor("_ZN3ccc8FF4x0y15E", this);} // tgen
ccc::FF4x0y15 ::FF4x0y15(){ note_ctor("_ZN3ccc8FF4x0y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x0y15E, buf);
    ::ccc::FF4x0y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x0y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y15E");
    check_base_class_offset(lv, (::ccc::EE4x0*), 0, "_ZN3ccc8FF4x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x0y15E);
    dp->::ccc::FF4x0y15::~FF4x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x0y15E(Test__ZN3ccc8FF4x0y15E, "_ZN3ccc8FF4x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x0y15C1Ev();
extern void _ZN3ccc8FF4x0y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x0y15E[] = {
  NSPAIR(_ZN3ccc8FF4x0y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x0E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x0E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x0E[];
static Base_Class bases__ZN3ccc8FF4x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x0y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x0y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv)();
extern void _ZN3ccc5EE4x03pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv)();
extern void _ZN3ccc5EE4x03abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv)();
extern void _ZN3ccc5EE4x03efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x0y15E[] = {
  {&(_ZTVN3ccc8FF4x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x0y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x0E__NS_8FF4x0y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x0y15E[];
static VTBL_ENTRY alt_thunk_names976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x03efgEv,_ZTv0_n20_N3ccc5EE4x03efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x03abcEv,_ZTv0_n16_N3ccc5EE4x03abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x03pqrEv,_ZTv0_n12_N3ccc5EE4x03pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x03pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x0y15E = {  "_ZN3ccc8FF4x0y15E", // class name
  bases__ZN3ccc8FF4x0y15E, 2,
  &(vtc__ZN3ccc8FF4x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x0y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x0y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x0y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x0y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names976,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y0  : virtual ::ccc::EE4x1 {
  virtual void  abc(); // _ZN3ccc7FF4x1y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y03pqrEv
  ~FF4x1y0(); // tgen
  FF4x1y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y03abcEv");}
void  ccc::FF4x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y03efgEv");}
void  ccc::FF4x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y03pqrEv");}
ccc::FF4x1y0 ::~FF4x1y0(){ note_dtor("_ZN3ccc7FF4x1y0E", this);} // tgen
ccc::FF4x1y0 ::FF4x1y0(){ note_ctor("_ZN3ccc7FF4x1y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y0E, buf);
    ::ccc::FF4x1y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y0E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y0E);
    dp->::ccc::FF4x1y0::~FF4x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y0E(Test__ZN3ccc7FF4x1y0E, "_ZN3ccc7FF4x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y0C1Ev();
extern void _ZN3ccc7FF4x1y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y0E[] = {
  NSPAIR(_ZN3ccc7FF4x1y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y0E[];
extern void _ZN3ccc7FF4x1y03pqrEv();
extern void _ZN3ccc7FF4x1y03abcEv();
extern void _ZN3ccc7FF4x1y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y0E[] = {
  {&(_ZTVN3ccc7FF4x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y0E[];
static VTBL_ENTRY alt_thunk_names977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y0E = {  "_ZN3ccc7FF4x1y0E", // class name
  bases__ZN3ccc7FF4x1y0E, 2,
  &(vtc__ZN3ccc7FF4x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names977,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y1  : virtual ::ccc::EE4x1 {
  virtual void  abc(); // _ZN3ccc7FF4x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x1y13efgEv
  ~FF4x1y1(); // tgen
  FF4x1y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y13abcEv");}
void  ccc::FF4x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y13pqrEv");}
void  ccc::FF4x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y13efgEv");}
ccc::FF4x1y1 ::~FF4x1y1(){ note_dtor("_ZN3ccc7FF4x1y1E", this);} // tgen
ccc::FF4x1y1 ::FF4x1y1(){ note_ctor("_ZN3ccc7FF4x1y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y1E, buf);
    ::ccc::FF4x1y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y1E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y1E);
    dp->::ccc::FF4x1y1::~FF4x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y1E(Test__ZN3ccc7FF4x1y1E, "_ZN3ccc7FF4x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y1C1Ev();
extern void _ZN3ccc7FF4x1y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y1E[] = {
  NSPAIR(_ZN3ccc7FF4x1y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y1E[];
extern void _ZN3ccc7FF4x1y13pqrEv();
extern void _ZN3ccc7FF4x1y13abcEv();
extern void _ZN3ccc7FF4x1y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y1E[] = {
  {&(_ZTVN3ccc7FF4x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y1E[];
static VTBL_ENTRY alt_thunk_names978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y1E = {  "_ZN3ccc7FF4x1y1E", // class name
  bases__ZN3ccc7FF4x1y1E, 2,
  &(vtc__ZN3ccc7FF4x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names978,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y2  : virtual ::ccc::EE4x1 {
  virtual void  efg(); // _ZN3ccc7FF4x1y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y23pqrEv
  ~FF4x1y2(); // tgen
  FF4x1y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y23efgEv");}
void  ccc::FF4x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y23abcEv");}
void  ccc::FF4x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y23pqrEv");}
ccc::FF4x1y2 ::~FF4x1y2(){ note_dtor("_ZN3ccc7FF4x1y2E", this);} // tgen
ccc::FF4x1y2 ::FF4x1y2(){ note_ctor("_ZN3ccc7FF4x1y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y2E, buf);
    ::ccc::FF4x1y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y2E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y2E);
    dp->::ccc::FF4x1y2::~FF4x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y2E(Test__ZN3ccc7FF4x1y2E, "_ZN3ccc7FF4x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y2C1Ev();
extern void _ZN3ccc7FF4x1y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y2E[] = {
  NSPAIR(_ZN3ccc7FF4x1y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y2E[];
extern void _ZN3ccc7FF4x1y23pqrEv();
extern void _ZN3ccc7FF4x1y23abcEv();
extern void _ZN3ccc7FF4x1y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y2E[] = {
  {&(_ZTVN3ccc7FF4x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y2E[];
static VTBL_ENTRY alt_thunk_names979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y2E = {  "_ZN3ccc7FF4x1y2E", // class name
  bases__ZN3ccc7FF4x1y2E, 2,
  &(vtc__ZN3ccc7FF4x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names979,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y3  : virtual ::ccc::EE4x1 {
  virtual void  efg(); // _ZN3ccc7FF4x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x1y33abcEv
  ~FF4x1y3(); // tgen
  FF4x1y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y33efgEv");}
void  ccc::FF4x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y33pqrEv");}
void  ccc::FF4x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y33abcEv");}
ccc::FF4x1y3 ::~FF4x1y3(){ note_dtor("_ZN3ccc7FF4x1y3E", this);} // tgen
ccc::FF4x1y3 ::FF4x1y3(){ note_ctor("_ZN3ccc7FF4x1y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y3E, buf);
    ::ccc::FF4x1y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y3E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y3E);
    dp->::ccc::FF4x1y3::~FF4x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y3E(Test__ZN3ccc7FF4x1y3E, "_ZN3ccc7FF4x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y3C1Ev();
extern void _ZN3ccc7FF4x1y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y3E[] = {
  NSPAIR(_ZN3ccc7FF4x1y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y3E[];
extern void _ZN3ccc7FF4x1y33pqrEv();
extern void _ZN3ccc7FF4x1y33abcEv();
extern void _ZN3ccc7FF4x1y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y3E[] = {
  {&(_ZTVN3ccc7FF4x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y3E[];
static VTBL_ENTRY alt_thunk_names980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y3E = {  "_ZN3ccc7FF4x1y3E", // class name
  bases__ZN3ccc7FF4x1y3E, 2,
  &(vtc__ZN3ccc7FF4x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names980,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y4  : virtual ::ccc::EE4x1 {
  virtual void  pqr(); // _ZN3ccc7FF4x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x1y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x1y43efgEv
  ~FF4x1y4(); // tgen
  FF4x1y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y43pqrEv");}
void  ccc::FF4x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y43abcEv");}
void  ccc::FF4x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y43efgEv");}
ccc::FF4x1y4 ::~FF4x1y4(){ note_dtor("_ZN3ccc7FF4x1y4E", this);} // tgen
ccc::FF4x1y4 ::FF4x1y4(){ note_ctor("_ZN3ccc7FF4x1y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y4E, buf);
    ::ccc::FF4x1y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y4E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y4E);
    dp->::ccc::FF4x1y4::~FF4x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y4E(Test__ZN3ccc7FF4x1y4E, "_ZN3ccc7FF4x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y4C1Ev();
extern void _ZN3ccc7FF4x1y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y4E[] = {
  NSPAIR(_ZN3ccc7FF4x1y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y4E[];
extern void _ZN3ccc7FF4x1y43pqrEv();
extern void _ZN3ccc7FF4x1y43abcEv();
extern void _ZN3ccc7FF4x1y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y4E[] = {
  {&(_ZTVN3ccc7FF4x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y4E[];
static VTBL_ENTRY alt_thunk_names981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y4E = {  "_ZN3ccc7FF4x1y4E", // class name
  bases__ZN3ccc7FF4x1y4E, 2,
  &(vtc__ZN3ccc7FF4x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names981,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y5  : virtual ::ccc::EE4x1 {
  virtual void  pqr(); // _ZN3ccc7FF4x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x1y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x1y53abcEv
  ~FF4x1y5(); // tgen
  FF4x1y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y53pqrEv");}
void  ccc::FF4x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y53efgEv");}
void  ccc::FF4x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y53abcEv");}
ccc::FF4x1y5 ::~FF4x1y5(){ note_dtor("_ZN3ccc7FF4x1y5E", this);} // tgen
ccc::FF4x1y5 ::FF4x1y5(){ note_ctor("_ZN3ccc7FF4x1y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y5E, buf);
    ::ccc::FF4x1y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y5E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y5E);
    dp->::ccc::FF4x1y5::~FF4x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y5E(Test__ZN3ccc7FF4x1y5E, "_ZN3ccc7FF4x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y5C1Ev();
extern void _ZN3ccc7FF4x1y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y5E[] = {
  NSPAIR(_ZN3ccc7FF4x1y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y5E[];
extern void _ZN3ccc7FF4x1y53pqrEv();
extern void _ZN3ccc7FF4x1y53abcEv();
extern void _ZN3ccc7FF4x1y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y5E[] = {
  {&(_ZTVN3ccc7FF4x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y5E[];
static VTBL_ENTRY alt_thunk_names982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y5E = {  "_ZN3ccc7FF4x1y5E", // class name
  bases__ZN3ccc7FF4x1y5E, 2,
  &(vtc__ZN3ccc7FF4x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names982,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y6  : virtual ::ccc::EE4x1 {
  virtual void  abc(); // _ZN3ccc7FF4x1y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x1y63efgEv
  ~FF4x1y6(); // tgen
  FF4x1y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y63abcEv");}
void  ccc::FF4x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y63efgEv");}
ccc::FF4x1y6 ::~FF4x1y6(){ note_dtor("_ZN3ccc7FF4x1y6E", this);} // tgen
ccc::FF4x1y6 ::FF4x1y6(){ note_ctor("_ZN3ccc7FF4x1y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y6E, buf);
    ::ccc::FF4x1y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y6E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y6E);
    dp->::ccc::FF4x1y6::~FF4x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y6E(Test__ZN3ccc7FF4x1y6E, "_ZN3ccc7FF4x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y6C1Ev();
extern void _ZN3ccc7FF4x1y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y6E[] = {
  NSPAIR(_ZN3ccc7FF4x1y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x1y63abcEv();
extern void _ZN3ccc7FF4x1y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y6E[] = {
  {&(_ZTVN3ccc7FF4x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y6E[];
static VTBL_ENTRY alt_thunk_names983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y6E = {  "_ZN3ccc7FF4x1y6E", // class name
  bases__ZN3ccc7FF4x1y6E, 2,
  &(vtc__ZN3ccc7FF4x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names983,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y7  : virtual ::ccc::EE4x1 {
  virtual void  abc(); // _ZN3ccc7FF4x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y73pqrEv
  ~FF4x1y7(); // tgen
  FF4x1y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y73abcEv");}
void  ccc::FF4x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y73pqrEv");}
ccc::FF4x1y7 ::~FF4x1y7(){ note_dtor("_ZN3ccc7FF4x1y7E", this);} // tgen
ccc::FF4x1y7 ::FF4x1y7(){ note_ctor("_ZN3ccc7FF4x1y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y7E, buf);
    ::ccc::FF4x1y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y7E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y7E);
    dp->::ccc::FF4x1y7::~FF4x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y7E(Test__ZN3ccc7FF4x1y7E, "_ZN3ccc7FF4x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y7C1Ev();
extern void _ZN3ccc7FF4x1y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y7E[] = {
  NSPAIR(_ZN3ccc7FF4x1y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y7E[];
extern void _ZN3ccc7FF4x1y73pqrEv();
extern void _ZN3ccc7FF4x1y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y7E[] = {
  {&(_ZTVN3ccc7FF4x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y7E[];
static VTBL_ENTRY alt_thunk_names984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y7E = {  "_ZN3ccc7FF4x1y7E", // class name
  bases__ZN3ccc7FF4x1y7E, 2,
  &(vtc__ZN3ccc7FF4x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names984,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y8  : virtual ::ccc::EE4x1 {
  virtual void  efg(); // _ZN3ccc7FF4x1y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x1y83abcEv
  ~FF4x1y8(); // tgen
  FF4x1y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y83efgEv");}
void  ccc::FF4x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x1y83abcEv");}
ccc::FF4x1y8 ::~FF4x1y8(){ note_dtor("_ZN3ccc7FF4x1y8E", this);} // tgen
ccc::FF4x1y8 ::FF4x1y8(){ note_ctor("_ZN3ccc7FF4x1y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y8E, buf);
    ::ccc::FF4x1y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y8E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y8E);
    dp->::ccc::FF4x1y8::~FF4x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y8E(Test__ZN3ccc7FF4x1y8E, "_ZN3ccc7FF4x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y8C1Ev();
extern void _ZN3ccc7FF4x1y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y8E[] = {
  NSPAIR(_ZN3ccc7FF4x1y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x1y83abcEv();
extern void _ZN3ccc7FF4x1y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y8E[] = {
  {&(_ZTVN3ccc7FF4x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y8E[];
static VTBL_ENTRY alt_thunk_names985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y8E = {  "_ZN3ccc7FF4x1y8E", // class name
  bases__ZN3ccc7FF4x1y8E, 2,
  &(vtc__ZN3ccc7FF4x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names985,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y9  : virtual ::ccc::EE4x1 {
  virtual void  efg(); // _ZN3ccc7FF4x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x1y93pqrEv
  ~FF4x1y9(); // tgen
  FF4x1y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x1y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x1y93efgEv");}
void  ccc::FF4x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x1y93pqrEv");}
ccc::FF4x1y9 ::~FF4x1y9(){ note_dtor("_ZN3ccc7FF4x1y9E", this);} // tgen
ccc::FF4x1y9 ::FF4x1y9(){ note_ctor("_ZN3ccc7FF4x1y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x1y9E, buf);
    ::ccc::FF4x1y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x1y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y9E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc7FF4x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x1y9E);
    dp->::ccc::FF4x1y9::~FF4x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x1y9E(Test__ZN3ccc7FF4x1y9E, "_ZN3ccc7FF4x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x1y9C1Ev();
extern void _ZN3ccc7FF4x1y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x1y9E[] = {
  NSPAIR(_ZN3ccc7FF4x1y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc7FF4x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y9E[];
extern void _ZN3ccc7FF4x1y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x1y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x1y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x1y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x1y9E[] = {
  {&(_ZTVN3ccc7FF4x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x1y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_7FF4x1y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x1y9E[];
static VTBL_ENTRY alt_thunk_names986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x1y9E = {  "_ZN3ccc7FF4x1y9E", // class name
  bases__ZN3ccc7FF4x1y9E, 2,
  &(vtc__ZN3ccc7FF4x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x1y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x1y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x1y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x1y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names986,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y10  : virtual ::ccc::EE4x1 {
  virtual void  pqr(); // _ZN3ccc8FF4x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x1y103abcEv
  ~FF4x1y10(); // tgen
  FF4x1y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x1y103pqrEv");}
void  ccc::FF4x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x1y103abcEv");}
ccc::FF4x1y10 ::~FF4x1y10(){ note_dtor("_ZN3ccc8FF4x1y10E", this);} // tgen
ccc::FF4x1y10 ::FF4x1y10(){ note_ctor("_ZN3ccc8FF4x1y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y10E, buf);
    ::ccc::FF4x1y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y10E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y10E);
    dp->::ccc::FF4x1y10::~FF4x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y10E(Test__ZN3ccc8FF4x1y10E, "_ZN3ccc8FF4x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y10C1Ev();
extern void _ZN3ccc8FF4x1y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y10E[] = {
  NSPAIR(_ZN3ccc8FF4x1y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y10E[];
extern void _ZN3ccc8FF4x1y103pqrEv();
extern void _ZN3ccc8FF4x1y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y10E[] = {
  {&(_ZTVN3ccc8FF4x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y10E[];
static VTBL_ENTRY alt_thunk_names987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y10E = {  "_ZN3ccc8FF4x1y10E", // class name
  bases__ZN3ccc8FF4x1y10E, 2,
  &(vtc__ZN3ccc8FF4x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names987,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y11  : virtual ::ccc::EE4x1 {
  virtual void  pqr(); // _ZN3ccc8FF4x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x1y113efgEv
  ~FF4x1y11(); // tgen
  FF4x1y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x1y113pqrEv");}
void  ccc::FF4x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x1y113efgEv");}
ccc::FF4x1y11 ::~FF4x1y11(){ note_dtor("_ZN3ccc8FF4x1y11E", this);} // tgen
ccc::FF4x1y11 ::FF4x1y11(){ note_ctor("_ZN3ccc8FF4x1y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y11E, buf);
    ::ccc::FF4x1y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y11E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y11E);
    dp->::ccc::FF4x1y11::~FF4x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y11E(Test__ZN3ccc8FF4x1y11E, "_ZN3ccc8FF4x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y11C1Ev();
extern void _ZN3ccc8FF4x1y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y11E[] = {
  NSPAIR(_ZN3ccc8FF4x1y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y11E[];
extern void _ZN3ccc8FF4x1y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x1y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y11E[] = {
  {&(_ZTVN3ccc8FF4x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y11E[];
static VTBL_ENTRY alt_thunk_names988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y11E = {  "_ZN3ccc8FF4x1y11E", // class name
  bases__ZN3ccc8FF4x1y11E, 2,
  &(vtc__ZN3ccc8FF4x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names988,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y12  : virtual ::ccc::EE4x1 {
  virtual void  abc(); // _ZN3ccc8FF4x1y123abcEv
  ~FF4x1y12(); // tgen
  FF4x1y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x1y123abcEv");}
ccc::FF4x1y12 ::~FF4x1y12(){ note_dtor("_ZN3ccc8FF4x1y12E", this);} // tgen
ccc::FF4x1y12 ::FF4x1y12(){ note_ctor("_ZN3ccc8FF4x1y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y12E, buf);
    ::ccc::FF4x1y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y12E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y12E);
    dp->::ccc::FF4x1y12::~FF4x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y12E(Test__ZN3ccc8FF4x1y12E, "_ZN3ccc8FF4x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y12C1Ev();
extern void _ZN3ccc8FF4x1y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y12E[] = {
  NSPAIR(_ZN3ccc8FF4x1y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x1y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y12E[] = {
  {&(_ZTVN3ccc8FF4x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y12E[];
static VTBL_ENTRY alt_thunk_names989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y12E = {  "_ZN3ccc8FF4x1y12E", // class name
  bases__ZN3ccc8FF4x1y12E, 2,
  &(vtc__ZN3ccc8FF4x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names989,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y13  : virtual ::ccc::EE4x1 {
  virtual void  efg(); // _ZN3ccc8FF4x1y133efgEv
  ~FF4x1y13(); // tgen
  FF4x1y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x1y133efgEv");}
ccc::FF4x1y13 ::~FF4x1y13(){ note_dtor("_ZN3ccc8FF4x1y13E", this);} // tgen
ccc::FF4x1y13 ::FF4x1y13(){ note_ctor("_ZN3ccc8FF4x1y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y13E, buf);
    ::ccc::FF4x1y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y13E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y13E);
    dp->::ccc::FF4x1y13::~FF4x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y13E(Test__ZN3ccc8FF4x1y13E, "_ZN3ccc8FF4x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y13C1Ev();
extern void _ZN3ccc8FF4x1y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y13E[] = {
  NSPAIR(_ZN3ccc8FF4x1y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x1y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y13E[] = {
  {&(_ZTVN3ccc8FF4x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y13E[];
static VTBL_ENTRY alt_thunk_names990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y13E = {  "_ZN3ccc8FF4x1y13E", // class name
  bases__ZN3ccc8FF4x1y13E, 2,
  &(vtc__ZN3ccc8FF4x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names990,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y14  : virtual ::ccc::EE4x1 {
  virtual void  pqr(); // _ZN3ccc8FF4x1y143pqrEv
  ~FF4x1y14(); // tgen
  FF4x1y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x1y143pqrEv");}
ccc::FF4x1y14 ::~FF4x1y14(){ note_dtor("_ZN3ccc8FF4x1y14E", this);} // tgen
ccc::FF4x1y14 ::FF4x1y14(){ note_ctor("_ZN3ccc8FF4x1y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y14E, buf);
    ::ccc::FF4x1y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y14E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y14E);
    dp->::ccc::FF4x1y14::~FF4x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y14E(Test__ZN3ccc8FF4x1y14E, "_ZN3ccc8FF4x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y14C1Ev();
extern void _ZN3ccc8FF4x1y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y14E[] = {
  NSPAIR(_ZN3ccc8FF4x1y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y14E[];
extern void _ZN3ccc8FF4x1y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x1y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y14E[] = {
  {&(_ZTVN3ccc8FF4x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y14E[];
static VTBL_ENTRY alt_thunk_names991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y14E = {  "_ZN3ccc8FF4x1y14E", // class name
  bases__ZN3ccc8FF4x1y14E, 2,
  &(vtc__ZN3ccc8FF4x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names991,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x1y15  : virtual ::ccc::EE4x1 {
  ~FF4x1y15(); // tgen
  FF4x1y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x1y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x1y15 ::~FF4x1y15(){ note_dtor("_ZN3ccc8FF4x1y15E", this);} // tgen
ccc::FF4x1y15 ::FF4x1y15(){ note_ctor("_ZN3ccc8FF4x1y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x1y15E, buf);
    ::ccc::FF4x1y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x1y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y15E");
    check_base_class_offset(lv, (::ccc::EE4x1*), 0, "_ZN3ccc8FF4x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x1y15E);
    dp->::ccc::FF4x1y15::~FF4x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x1y15E(Test__ZN3ccc8FF4x1y15E, "_ZN3ccc8FF4x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x1y15C1Ev();
extern void _ZN3ccc8FF4x1y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x1y15E[] = {
  NSPAIR(_ZN3ccc8FF4x1y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x1E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x1E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x1E[];
static Base_Class bases__ZN3ccc8FF4x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x1y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x1y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv)();
extern void _ZN3ccc5EE4x13pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv)();
extern void _ZN3ccc5EE4x13abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv)();
extern void _ZN3ccc5EE4x13efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x1y15E[] = {
  {&(_ZTVN3ccc8FF4x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x1y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x1E__NS_8FF4x1y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x1y15E[];
static VTBL_ENTRY alt_thunk_names992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x13efgEv,_ZTv0_n20_N3ccc5EE4x13efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x13abcEv,_ZTv0_n16_N3ccc5EE4x13abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x13pqrEv,_ZTv0_n12_N3ccc5EE4x13pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x13pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x1y15E = {  "_ZN3ccc8FF4x1y15E", // class name
  bases__ZN3ccc8FF4x1y15E, 2,
  &(vtc__ZN3ccc8FF4x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x1y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x1y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x1y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x1y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names992,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y0  : virtual ::ccc::EE4x2 {
  virtual void  abc(); // _ZN3ccc7FF4x2y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y03pqrEv
  ~FF4x2y0(); // tgen
  FF4x2y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y03abcEv");}
void  ccc::FF4x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y03efgEv");}
void  ccc::FF4x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y03pqrEv");}
ccc::FF4x2y0 ::~FF4x2y0(){ note_dtor("_ZN3ccc7FF4x2y0E", this);} // tgen
ccc::FF4x2y0 ::FF4x2y0(){ note_ctor("_ZN3ccc7FF4x2y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y0E, buf);
    ::ccc::FF4x2y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y0E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y0E);
    dp->::ccc::FF4x2y0::~FF4x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y0E(Test__ZN3ccc7FF4x2y0E, "_ZN3ccc7FF4x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y0C1Ev();
extern void _ZN3ccc7FF4x2y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y0E[] = {
  NSPAIR(_ZN3ccc7FF4x2y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y0E[];
extern void _ZN3ccc7FF4x2y03pqrEv();
extern void _ZN3ccc7FF4x2y03abcEv();
extern void _ZN3ccc7FF4x2y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y0E[] = {
  {&(_ZTVN3ccc7FF4x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y0E[];
static VTBL_ENTRY alt_thunk_names993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y0E = {  "_ZN3ccc7FF4x2y0E", // class name
  bases__ZN3ccc7FF4x2y0E, 2,
  &(vtc__ZN3ccc7FF4x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names993,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y1  : virtual ::ccc::EE4x2 {
  virtual void  abc(); // _ZN3ccc7FF4x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x2y13efgEv
  ~FF4x2y1(); // tgen
  FF4x2y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y13abcEv");}
void  ccc::FF4x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y13pqrEv");}
void  ccc::FF4x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y13efgEv");}
ccc::FF4x2y1 ::~FF4x2y1(){ note_dtor("_ZN3ccc7FF4x2y1E", this);} // tgen
ccc::FF4x2y1 ::FF4x2y1(){ note_ctor("_ZN3ccc7FF4x2y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y1E, buf);
    ::ccc::FF4x2y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y1E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y1E);
    dp->::ccc::FF4x2y1::~FF4x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y1E(Test__ZN3ccc7FF4x2y1E, "_ZN3ccc7FF4x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y1C1Ev();
extern void _ZN3ccc7FF4x2y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y1E[] = {
  NSPAIR(_ZN3ccc7FF4x2y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y1E[];
extern void _ZN3ccc7FF4x2y13pqrEv();
extern void _ZN3ccc7FF4x2y13abcEv();
extern void _ZN3ccc7FF4x2y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y1E[] = {
  {&(_ZTVN3ccc7FF4x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y1E[];
static VTBL_ENTRY alt_thunk_names994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y1E = {  "_ZN3ccc7FF4x2y1E", // class name
  bases__ZN3ccc7FF4x2y1E, 2,
  &(vtc__ZN3ccc7FF4x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names994,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y2  : virtual ::ccc::EE4x2 {
  virtual void  efg(); // _ZN3ccc7FF4x2y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y23pqrEv
  ~FF4x2y2(); // tgen
  FF4x2y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y23efgEv");}
void  ccc::FF4x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y23abcEv");}
void  ccc::FF4x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y23pqrEv");}
ccc::FF4x2y2 ::~FF4x2y2(){ note_dtor("_ZN3ccc7FF4x2y2E", this);} // tgen
ccc::FF4x2y2 ::FF4x2y2(){ note_ctor("_ZN3ccc7FF4x2y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y2E, buf);
    ::ccc::FF4x2y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y2E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y2E);
    dp->::ccc::FF4x2y2::~FF4x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y2E(Test__ZN3ccc7FF4x2y2E, "_ZN3ccc7FF4x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y2C1Ev();
extern void _ZN3ccc7FF4x2y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y2E[] = {
  NSPAIR(_ZN3ccc7FF4x2y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y2E[];
extern void _ZN3ccc7FF4x2y23pqrEv();
extern void _ZN3ccc7FF4x2y23abcEv();
extern void _ZN3ccc7FF4x2y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y2E[] = {
  {&(_ZTVN3ccc7FF4x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y2E[];
static VTBL_ENTRY alt_thunk_names995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y2E = {  "_ZN3ccc7FF4x2y2E", // class name
  bases__ZN3ccc7FF4x2y2E, 2,
  &(vtc__ZN3ccc7FF4x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names995,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y3  : virtual ::ccc::EE4x2 {
  virtual void  efg(); // _ZN3ccc7FF4x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x2y33abcEv
  ~FF4x2y3(); // tgen
  FF4x2y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y33efgEv");}
void  ccc::FF4x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y33pqrEv");}
void  ccc::FF4x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y33abcEv");}
ccc::FF4x2y3 ::~FF4x2y3(){ note_dtor("_ZN3ccc7FF4x2y3E", this);} // tgen
ccc::FF4x2y3 ::FF4x2y3(){ note_ctor("_ZN3ccc7FF4x2y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y3E, buf);
    ::ccc::FF4x2y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y3E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y3E);
    dp->::ccc::FF4x2y3::~FF4x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y3E(Test__ZN3ccc7FF4x2y3E, "_ZN3ccc7FF4x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y3C1Ev();
extern void _ZN3ccc7FF4x2y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y3E[] = {
  NSPAIR(_ZN3ccc7FF4x2y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y3E[];
extern void _ZN3ccc7FF4x2y33pqrEv();
extern void _ZN3ccc7FF4x2y33abcEv();
extern void _ZN3ccc7FF4x2y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y3E[] = {
  {&(_ZTVN3ccc7FF4x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y3E[];
static VTBL_ENTRY alt_thunk_names996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y3E = {  "_ZN3ccc7FF4x2y3E", // class name
  bases__ZN3ccc7FF4x2y3E, 2,
  &(vtc__ZN3ccc7FF4x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names996,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y4  : virtual ::ccc::EE4x2 {
  virtual void  pqr(); // _ZN3ccc7FF4x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x2y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x2y43efgEv
  ~FF4x2y4(); // tgen
  FF4x2y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y43pqrEv");}
void  ccc::FF4x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y43abcEv");}
void  ccc::FF4x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y43efgEv");}
ccc::FF4x2y4 ::~FF4x2y4(){ note_dtor("_ZN3ccc7FF4x2y4E", this);} // tgen
ccc::FF4x2y4 ::FF4x2y4(){ note_ctor("_ZN3ccc7FF4x2y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y4E, buf);
    ::ccc::FF4x2y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y4E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y4E);
    dp->::ccc::FF4x2y4::~FF4x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y4E(Test__ZN3ccc7FF4x2y4E, "_ZN3ccc7FF4x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y4C1Ev();
extern void _ZN3ccc7FF4x2y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y4E[] = {
  NSPAIR(_ZN3ccc7FF4x2y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y4E[];
extern void _ZN3ccc7FF4x2y43pqrEv();
extern void _ZN3ccc7FF4x2y43abcEv();
extern void _ZN3ccc7FF4x2y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y4E[] = {
  {&(_ZTVN3ccc7FF4x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y4E[];
static VTBL_ENTRY alt_thunk_names997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y4E = {  "_ZN3ccc7FF4x2y4E", // class name
  bases__ZN3ccc7FF4x2y4E, 2,
  &(vtc__ZN3ccc7FF4x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names997,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y5  : virtual ::ccc::EE4x2 {
  virtual void  pqr(); // _ZN3ccc7FF4x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x2y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x2y53abcEv
  ~FF4x2y5(); // tgen
  FF4x2y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y53pqrEv");}
void  ccc::FF4x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y53efgEv");}
void  ccc::FF4x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y53abcEv");}
ccc::FF4x2y5 ::~FF4x2y5(){ note_dtor("_ZN3ccc7FF4x2y5E", this);} // tgen
ccc::FF4x2y5 ::FF4x2y5(){ note_ctor("_ZN3ccc7FF4x2y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y5E, buf);
    ::ccc::FF4x2y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y5E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y5E);
    dp->::ccc::FF4x2y5::~FF4x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y5E(Test__ZN3ccc7FF4x2y5E, "_ZN3ccc7FF4x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y5C1Ev();
extern void _ZN3ccc7FF4x2y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y5E[] = {
  NSPAIR(_ZN3ccc7FF4x2y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y5E[];
extern void _ZN3ccc7FF4x2y53pqrEv();
extern void _ZN3ccc7FF4x2y53abcEv();
extern void _ZN3ccc7FF4x2y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y5E[] = {
  {&(_ZTVN3ccc7FF4x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y5E[];
static VTBL_ENTRY alt_thunk_names998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y5E = {  "_ZN3ccc7FF4x2y5E", // class name
  bases__ZN3ccc7FF4x2y5E, 2,
  &(vtc__ZN3ccc7FF4x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names998,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y6  : virtual ::ccc::EE4x2 {
  virtual void  abc(); // _ZN3ccc7FF4x2y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x2y63efgEv
  ~FF4x2y6(); // tgen
  FF4x2y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y63abcEv");}
void  ccc::FF4x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y63efgEv");}
ccc::FF4x2y6 ::~FF4x2y6(){ note_dtor("_ZN3ccc7FF4x2y6E", this);} // tgen
ccc::FF4x2y6 ::FF4x2y6(){ note_ctor("_ZN3ccc7FF4x2y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y6E, buf);
    ::ccc::FF4x2y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y6E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y6E);
    dp->::ccc::FF4x2y6::~FF4x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y6E(Test__ZN3ccc7FF4x2y6E, "_ZN3ccc7FF4x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y6C1Ev();
extern void _ZN3ccc7FF4x2y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y6E[] = {
  NSPAIR(_ZN3ccc7FF4x2y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x2y63abcEv();
extern void _ZN3ccc7FF4x2y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y6E[] = {
  {&(_ZTVN3ccc7FF4x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y6E[];
static VTBL_ENTRY alt_thunk_names999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y6E = {  "_ZN3ccc7FF4x2y6E", // class name
  bases__ZN3ccc7FF4x2y6E, 2,
  &(vtc__ZN3ccc7FF4x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names999,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y7  : virtual ::ccc::EE4x2 {
  virtual void  abc(); // _ZN3ccc7FF4x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y73pqrEv
  ~FF4x2y7(); // tgen
  FF4x2y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y73abcEv");}
void  ccc::FF4x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y73pqrEv");}
ccc::FF4x2y7 ::~FF4x2y7(){ note_dtor("_ZN3ccc7FF4x2y7E", this);} // tgen
ccc::FF4x2y7 ::FF4x2y7(){ note_ctor("_ZN3ccc7FF4x2y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y7E, buf);
    ::ccc::FF4x2y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y7E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y7E);
    dp->::ccc::FF4x2y7::~FF4x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y7E(Test__ZN3ccc7FF4x2y7E, "_ZN3ccc7FF4x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y7C1Ev();
extern void _ZN3ccc7FF4x2y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y7E[] = {
  NSPAIR(_ZN3ccc7FF4x2y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y7E[];
extern void _ZN3ccc7FF4x2y73pqrEv();
extern void _ZN3ccc7FF4x2y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y7E[] = {
  {&(_ZTVN3ccc7FF4x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y7E[];
static VTBL_ENTRY alt_thunk_names1000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y7E = {  "_ZN3ccc7FF4x2y7E", // class name
  bases__ZN3ccc7FF4x2y7E, 2,
  &(vtc__ZN3ccc7FF4x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1000,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y8  : virtual ::ccc::EE4x2 {
  virtual void  efg(); // _ZN3ccc7FF4x2y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x2y83abcEv
  ~FF4x2y8(); // tgen
  FF4x2y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y83efgEv");}
void  ccc::FF4x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x2y83abcEv");}
ccc::FF4x2y8 ::~FF4x2y8(){ note_dtor("_ZN3ccc7FF4x2y8E", this);} // tgen
ccc::FF4x2y8 ::FF4x2y8(){ note_ctor("_ZN3ccc7FF4x2y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y8E, buf);
    ::ccc::FF4x2y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y8E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y8E);
    dp->::ccc::FF4x2y8::~FF4x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y8E(Test__ZN3ccc7FF4x2y8E, "_ZN3ccc7FF4x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y8C1Ev();
extern void _ZN3ccc7FF4x2y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y8E[] = {
  NSPAIR(_ZN3ccc7FF4x2y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x2y83abcEv();
extern void _ZN3ccc7FF4x2y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y8E[] = {
  {&(_ZTVN3ccc7FF4x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y8E[];
static VTBL_ENTRY alt_thunk_names1001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y8E = {  "_ZN3ccc7FF4x2y8E", // class name
  bases__ZN3ccc7FF4x2y8E, 2,
  &(vtc__ZN3ccc7FF4x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1001,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y9  : virtual ::ccc::EE4x2 {
  virtual void  efg(); // _ZN3ccc7FF4x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x2y93pqrEv
  ~FF4x2y9(); // tgen
  FF4x2y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x2y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x2y93efgEv");}
void  ccc::FF4x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x2y93pqrEv");}
ccc::FF4x2y9 ::~FF4x2y9(){ note_dtor("_ZN3ccc7FF4x2y9E", this);} // tgen
ccc::FF4x2y9 ::FF4x2y9(){ note_ctor("_ZN3ccc7FF4x2y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x2y9E, buf);
    ::ccc::FF4x2y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x2y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y9E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc7FF4x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x2y9E);
    dp->::ccc::FF4x2y9::~FF4x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x2y9E(Test__ZN3ccc7FF4x2y9E, "_ZN3ccc7FF4x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x2y9C1Ev();
extern void _ZN3ccc7FF4x2y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x2y9E[] = {
  NSPAIR(_ZN3ccc7FF4x2y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc7FF4x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y9E[];
extern void _ZN3ccc7FF4x2y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x2y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x2y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x2y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x2y9E[] = {
  {&(_ZTVN3ccc7FF4x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x2y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_7FF4x2y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x2y9E[];
static VTBL_ENTRY alt_thunk_names1002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x2y9E = {  "_ZN3ccc7FF4x2y9E", // class name
  bases__ZN3ccc7FF4x2y9E, 2,
  &(vtc__ZN3ccc7FF4x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x2y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x2y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x2y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x2y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1002,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y10  : virtual ::ccc::EE4x2 {
  virtual void  pqr(); // _ZN3ccc8FF4x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x2y103abcEv
  ~FF4x2y10(); // tgen
  FF4x2y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x2y103pqrEv");}
void  ccc::FF4x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x2y103abcEv");}
ccc::FF4x2y10 ::~FF4x2y10(){ note_dtor("_ZN3ccc8FF4x2y10E", this);} // tgen
ccc::FF4x2y10 ::FF4x2y10(){ note_ctor("_ZN3ccc8FF4x2y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y10E, buf);
    ::ccc::FF4x2y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y10E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y10E);
    dp->::ccc::FF4x2y10::~FF4x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y10E(Test__ZN3ccc8FF4x2y10E, "_ZN3ccc8FF4x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y10C1Ev();
extern void _ZN3ccc8FF4x2y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y10E[] = {
  NSPAIR(_ZN3ccc8FF4x2y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y10E[];
extern void _ZN3ccc8FF4x2y103pqrEv();
extern void _ZN3ccc8FF4x2y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y10E[] = {
  {&(_ZTVN3ccc8FF4x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y10E[];
static VTBL_ENTRY alt_thunk_names1003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y10E = {  "_ZN3ccc8FF4x2y10E", // class name
  bases__ZN3ccc8FF4x2y10E, 2,
  &(vtc__ZN3ccc8FF4x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1003,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y11  : virtual ::ccc::EE4x2 {
  virtual void  pqr(); // _ZN3ccc8FF4x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x2y113efgEv
  ~FF4x2y11(); // tgen
  FF4x2y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x2y113pqrEv");}
void  ccc::FF4x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x2y113efgEv");}
ccc::FF4x2y11 ::~FF4x2y11(){ note_dtor("_ZN3ccc8FF4x2y11E", this);} // tgen
ccc::FF4x2y11 ::FF4x2y11(){ note_ctor("_ZN3ccc8FF4x2y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y11E, buf);
    ::ccc::FF4x2y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y11E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y11E);
    dp->::ccc::FF4x2y11::~FF4x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y11E(Test__ZN3ccc8FF4x2y11E, "_ZN3ccc8FF4x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y11C1Ev();
extern void _ZN3ccc8FF4x2y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y11E[] = {
  NSPAIR(_ZN3ccc8FF4x2y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y11E[];
extern void _ZN3ccc8FF4x2y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x2y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y11E[] = {
  {&(_ZTVN3ccc8FF4x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y11E[];
static VTBL_ENTRY alt_thunk_names1004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y11E = {  "_ZN3ccc8FF4x2y11E", // class name
  bases__ZN3ccc8FF4x2y11E, 2,
  &(vtc__ZN3ccc8FF4x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1004,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y12  : virtual ::ccc::EE4x2 {
  virtual void  abc(); // _ZN3ccc8FF4x2y123abcEv
  ~FF4x2y12(); // tgen
  FF4x2y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x2y123abcEv");}
ccc::FF4x2y12 ::~FF4x2y12(){ note_dtor("_ZN3ccc8FF4x2y12E", this);} // tgen
ccc::FF4x2y12 ::FF4x2y12(){ note_ctor("_ZN3ccc8FF4x2y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y12E, buf);
    ::ccc::FF4x2y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y12E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y12E);
    dp->::ccc::FF4x2y12::~FF4x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y12E(Test__ZN3ccc8FF4x2y12E, "_ZN3ccc8FF4x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y12C1Ev();
extern void _ZN3ccc8FF4x2y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y12E[] = {
  NSPAIR(_ZN3ccc8FF4x2y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x2y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y12E[] = {
  {&(_ZTVN3ccc8FF4x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y12E[];
static VTBL_ENTRY alt_thunk_names1005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y12E = {  "_ZN3ccc8FF4x2y12E", // class name
  bases__ZN3ccc8FF4x2y12E, 2,
  &(vtc__ZN3ccc8FF4x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1005,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y13  : virtual ::ccc::EE4x2 {
  virtual void  efg(); // _ZN3ccc8FF4x2y133efgEv
  ~FF4x2y13(); // tgen
  FF4x2y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x2y133efgEv");}
ccc::FF4x2y13 ::~FF4x2y13(){ note_dtor("_ZN3ccc8FF4x2y13E", this);} // tgen
ccc::FF4x2y13 ::FF4x2y13(){ note_ctor("_ZN3ccc8FF4x2y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y13E, buf);
    ::ccc::FF4x2y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y13E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y13E);
    dp->::ccc::FF4x2y13::~FF4x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y13E(Test__ZN3ccc8FF4x2y13E, "_ZN3ccc8FF4x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y13C1Ev();
extern void _ZN3ccc8FF4x2y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y13E[] = {
  NSPAIR(_ZN3ccc8FF4x2y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x2y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y13E[] = {
  {&(_ZTVN3ccc8FF4x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y13E[];
static VTBL_ENTRY alt_thunk_names1006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y13E = {  "_ZN3ccc8FF4x2y13E", // class name
  bases__ZN3ccc8FF4x2y13E, 2,
  &(vtc__ZN3ccc8FF4x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1006,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y14  : virtual ::ccc::EE4x2 {
  virtual void  pqr(); // _ZN3ccc8FF4x2y143pqrEv
  ~FF4x2y14(); // tgen
  FF4x2y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x2y143pqrEv");}
ccc::FF4x2y14 ::~FF4x2y14(){ note_dtor("_ZN3ccc8FF4x2y14E", this);} // tgen
ccc::FF4x2y14 ::FF4x2y14(){ note_ctor("_ZN3ccc8FF4x2y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y14E, buf);
    ::ccc::FF4x2y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y14E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y14E);
    dp->::ccc::FF4x2y14::~FF4x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y14E(Test__ZN3ccc8FF4x2y14E, "_ZN3ccc8FF4x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y14C1Ev();
extern void _ZN3ccc8FF4x2y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y14E[] = {
  NSPAIR(_ZN3ccc8FF4x2y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y14E[];
extern void _ZN3ccc8FF4x2y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x2y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y14E[] = {
  {&(_ZTVN3ccc8FF4x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y14E[];
static VTBL_ENTRY alt_thunk_names1007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y14E = {  "_ZN3ccc8FF4x2y14E", // class name
  bases__ZN3ccc8FF4x2y14E, 2,
  &(vtc__ZN3ccc8FF4x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1007,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x2y15  : virtual ::ccc::EE4x2 {
  ~FF4x2y15(); // tgen
  FF4x2y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x2y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x2y15 ::~FF4x2y15(){ note_dtor("_ZN3ccc8FF4x2y15E", this);} // tgen
ccc::FF4x2y15 ::FF4x2y15(){ note_ctor("_ZN3ccc8FF4x2y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x2y15E, buf);
    ::ccc::FF4x2y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x2y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y15E");
    check_base_class_offset(lv, (::ccc::EE4x2*), 0, "_ZN3ccc8FF4x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x2y15E);
    dp->::ccc::FF4x2y15::~FF4x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x2y15E(Test__ZN3ccc8FF4x2y15E, "_ZN3ccc8FF4x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x2y15C1Ev();
extern void _ZN3ccc8FF4x2y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x2y15E[] = {
  NSPAIR(_ZN3ccc8FF4x2y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x2E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x2E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x2E[];
static Base_Class bases__ZN3ccc8FF4x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x2y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x2y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv)();
extern void _ZN3ccc5EE4x23pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv)();
extern void _ZN3ccc5EE4x23abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv)();
extern void _ZN3ccc5EE4x23efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x2y15E[] = {
  {&(_ZTVN3ccc8FF4x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x2y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x2E__NS_8FF4x2y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x2y15E[];
static VTBL_ENTRY alt_thunk_names1008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x23efgEv,_ZTv0_n20_N3ccc5EE4x23efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x23abcEv,_ZTv0_n16_N3ccc5EE4x23abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x23pqrEv,_ZTv0_n12_N3ccc5EE4x23pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x23pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x2y15E = {  "_ZN3ccc8FF4x2y15E", // class name
  bases__ZN3ccc8FF4x2y15E, 2,
  &(vtc__ZN3ccc8FF4x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x2y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x2y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x2y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x2y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1008,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y0  : virtual ::ccc::EE4x3 {
  virtual void  abc(); // _ZN3ccc7FF4x3y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y03pqrEv
  ~FF4x3y0(); // tgen
  FF4x3y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y03abcEv");}
void  ccc::FF4x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y03efgEv");}
void  ccc::FF4x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y03pqrEv");}
ccc::FF4x3y0 ::~FF4x3y0(){ note_dtor("_ZN3ccc7FF4x3y0E", this);} // tgen
ccc::FF4x3y0 ::FF4x3y0(){ note_ctor("_ZN3ccc7FF4x3y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y0E, buf);
    ::ccc::FF4x3y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y0E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y0E);
    dp->::ccc::FF4x3y0::~FF4x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y0E(Test__ZN3ccc7FF4x3y0E, "_ZN3ccc7FF4x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y0C1Ev();
extern void _ZN3ccc7FF4x3y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y0E[] = {
  NSPAIR(_ZN3ccc7FF4x3y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y0E[];
extern void _ZN3ccc7FF4x3y03pqrEv();
extern void _ZN3ccc7FF4x3y03abcEv();
extern void _ZN3ccc7FF4x3y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y0E[] = {
  {&(_ZTVN3ccc7FF4x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y0E[];
static VTBL_ENTRY alt_thunk_names1009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y0E = {  "_ZN3ccc7FF4x3y0E", // class name
  bases__ZN3ccc7FF4x3y0E, 2,
  &(vtc__ZN3ccc7FF4x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1009,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y1  : virtual ::ccc::EE4x3 {
  virtual void  abc(); // _ZN3ccc7FF4x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x3y13efgEv
  ~FF4x3y1(); // tgen
  FF4x3y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y13abcEv");}
void  ccc::FF4x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y13pqrEv");}
void  ccc::FF4x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y13efgEv");}
ccc::FF4x3y1 ::~FF4x3y1(){ note_dtor("_ZN3ccc7FF4x3y1E", this);} // tgen
ccc::FF4x3y1 ::FF4x3y1(){ note_ctor("_ZN3ccc7FF4x3y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y1E, buf);
    ::ccc::FF4x3y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y1E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y1E);
    dp->::ccc::FF4x3y1::~FF4x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y1E(Test__ZN3ccc7FF4x3y1E, "_ZN3ccc7FF4x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y1C1Ev();
extern void _ZN3ccc7FF4x3y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y1E[] = {
  NSPAIR(_ZN3ccc7FF4x3y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y1E[];
extern void _ZN3ccc7FF4x3y13pqrEv();
extern void _ZN3ccc7FF4x3y13abcEv();
extern void _ZN3ccc7FF4x3y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y1E[] = {
  {&(_ZTVN3ccc7FF4x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y1E[];
static VTBL_ENTRY alt_thunk_names1010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y1E = {  "_ZN3ccc7FF4x3y1E", // class name
  bases__ZN3ccc7FF4x3y1E, 2,
  &(vtc__ZN3ccc7FF4x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1010,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y2  : virtual ::ccc::EE4x3 {
  virtual void  efg(); // _ZN3ccc7FF4x3y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y23pqrEv
  ~FF4x3y2(); // tgen
  FF4x3y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y23efgEv");}
void  ccc::FF4x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y23abcEv");}
void  ccc::FF4x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y23pqrEv");}
ccc::FF4x3y2 ::~FF4x3y2(){ note_dtor("_ZN3ccc7FF4x3y2E", this);} // tgen
ccc::FF4x3y2 ::FF4x3y2(){ note_ctor("_ZN3ccc7FF4x3y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y2E, buf);
    ::ccc::FF4x3y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y2E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y2E);
    dp->::ccc::FF4x3y2::~FF4x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y2E(Test__ZN3ccc7FF4x3y2E, "_ZN3ccc7FF4x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y2C1Ev();
extern void _ZN3ccc7FF4x3y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y2E[] = {
  NSPAIR(_ZN3ccc7FF4x3y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y2E[];
extern void _ZN3ccc7FF4x3y23pqrEv();
extern void _ZN3ccc7FF4x3y23abcEv();
extern void _ZN3ccc7FF4x3y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y2E[] = {
  {&(_ZTVN3ccc7FF4x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y2E[];
static VTBL_ENTRY alt_thunk_names1011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y2E = {  "_ZN3ccc7FF4x3y2E", // class name
  bases__ZN3ccc7FF4x3y2E, 2,
  &(vtc__ZN3ccc7FF4x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1011,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y3  : virtual ::ccc::EE4x3 {
  virtual void  efg(); // _ZN3ccc7FF4x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x3y33abcEv
  ~FF4x3y3(); // tgen
  FF4x3y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y33efgEv");}
void  ccc::FF4x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y33pqrEv");}
void  ccc::FF4x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y33abcEv");}
ccc::FF4x3y3 ::~FF4x3y3(){ note_dtor("_ZN3ccc7FF4x3y3E", this);} // tgen
ccc::FF4x3y3 ::FF4x3y3(){ note_ctor("_ZN3ccc7FF4x3y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y3E, buf);
    ::ccc::FF4x3y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y3E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y3E);
    dp->::ccc::FF4x3y3::~FF4x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y3E(Test__ZN3ccc7FF4x3y3E, "_ZN3ccc7FF4x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y3C1Ev();
extern void _ZN3ccc7FF4x3y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y3E[] = {
  NSPAIR(_ZN3ccc7FF4x3y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y3E[];
extern void _ZN3ccc7FF4x3y33pqrEv();
extern void _ZN3ccc7FF4x3y33abcEv();
extern void _ZN3ccc7FF4x3y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y3E[] = {
  {&(_ZTVN3ccc7FF4x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y3E[];
static VTBL_ENTRY alt_thunk_names1012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y3E = {  "_ZN3ccc7FF4x3y3E", // class name
  bases__ZN3ccc7FF4x3y3E, 2,
  &(vtc__ZN3ccc7FF4x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1012,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y4  : virtual ::ccc::EE4x3 {
  virtual void  pqr(); // _ZN3ccc7FF4x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x3y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x3y43efgEv
  ~FF4x3y4(); // tgen
  FF4x3y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y43pqrEv");}
void  ccc::FF4x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y43abcEv");}
void  ccc::FF4x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y43efgEv");}
ccc::FF4x3y4 ::~FF4x3y4(){ note_dtor("_ZN3ccc7FF4x3y4E", this);} // tgen
ccc::FF4x3y4 ::FF4x3y4(){ note_ctor("_ZN3ccc7FF4x3y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y4E, buf);
    ::ccc::FF4x3y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y4E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y4E);
    dp->::ccc::FF4x3y4::~FF4x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y4E(Test__ZN3ccc7FF4x3y4E, "_ZN3ccc7FF4x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y4C1Ev();
extern void _ZN3ccc7FF4x3y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y4E[] = {
  NSPAIR(_ZN3ccc7FF4x3y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y4E[];
extern void _ZN3ccc7FF4x3y43pqrEv();
extern void _ZN3ccc7FF4x3y43abcEv();
extern void _ZN3ccc7FF4x3y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y4E[] = {
  {&(_ZTVN3ccc7FF4x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y4E[];
static VTBL_ENTRY alt_thunk_names1013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y4E = {  "_ZN3ccc7FF4x3y4E", // class name
  bases__ZN3ccc7FF4x3y4E, 2,
  &(vtc__ZN3ccc7FF4x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1013,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y5  : virtual ::ccc::EE4x3 {
  virtual void  pqr(); // _ZN3ccc7FF4x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x3y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x3y53abcEv
  ~FF4x3y5(); // tgen
  FF4x3y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y53pqrEv");}
void  ccc::FF4x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y53efgEv");}
void  ccc::FF4x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y53abcEv");}
ccc::FF4x3y5 ::~FF4x3y5(){ note_dtor("_ZN3ccc7FF4x3y5E", this);} // tgen
ccc::FF4x3y5 ::FF4x3y5(){ note_ctor("_ZN3ccc7FF4x3y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y5E, buf);
    ::ccc::FF4x3y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y5E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y5E);
    dp->::ccc::FF4x3y5::~FF4x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y5E(Test__ZN3ccc7FF4x3y5E, "_ZN3ccc7FF4x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y5C1Ev();
extern void _ZN3ccc7FF4x3y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y5E[] = {
  NSPAIR(_ZN3ccc7FF4x3y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y5E[];
extern void _ZN3ccc7FF4x3y53pqrEv();
extern void _ZN3ccc7FF4x3y53abcEv();
extern void _ZN3ccc7FF4x3y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y5E[] = {
  {&(_ZTVN3ccc7FF4x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y5E[];
static VTBL_ENTRY alt_thunk_names1014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y5E = {  "_ZN3ccc7FF4x3y5E", // class name
  bases__ZN3ccc7FF4x3y5E, 2,
  &(vtc__ZN3ccc7FF4x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1014,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y6  : virtual ::ccc::EE4x3 {
  virtual void  abc(); // _ZN3ccc7FF4x3y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x3y63efgEv
  ~FF4x3y6(); // tgen
  FF4x3y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y63abcEv");}
void  ccc::FF4x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y63efgEv");}
ccc::FF4x3y6 ::~FF4x3y6(){ note_dtor("_ZN3ccc7FF4x3y6E", this);} // tgen
ccc::FF4x3y6 ::FF4x3y6(){ note_ctor("_ZN3ccc7FF4x3y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y6E, buf);
    ::ccc::FF4x3y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y6E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y6E);
    dp->::ccc::FF4x3y6::~FF4x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y6E(Test__ZN3ccc7FF4x3y6E, "_ZN3ccc7FF4x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y6C1Ev();
extern void _ZN3ccc7FF4x3y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y6E[] = {
  NSPAIR(_ZN3ccc7FF4x3y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x3y63abcEv();
extern void _ZN3ccc7FF4x3y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y6E[] = {
  {&(_ZTVN3ccc7FF4x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y6E[];
static VTBL_ENTRY alt_thunk_names1015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y6E = {  "_ZN3ccc7FF4x3y6E", // class name
  bases__ZN3ccc7FF4x3y6E, 2,
  &(vtc__ZN3ccc7FF4x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1015,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y7  : virtual ::ccc::EE4x3 {
  virtual void  abc(); // _ZN3ccc7FF4x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y73pqrEv
  ~FF4x3y7(); // tgen
  FF4x3y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y73abcEv");}
void  ccc::FF4x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y73pqrEv");}
ccc::FF4x3y7 ::~FF4x3y7(){ note_dtor("_ZN3ccc7FF4x3y7E", this);} // tgen
ccc::FF4x3y7 ::FF4x3y7(){ note_ctor("_ZN3ccc7FF4x3y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y7E, buf);
    ::ccc::FF4x3y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y7E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y7E);
    dp->::ccc::FF4x3y7::~FF4x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y7E(Test__ZN3ccc7FF4x3y7E, "_ZN3ccc7FF4x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y7C1Ev();
extern void _ZN3ccc7FF4x3y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y7E[] = {
  NSPAIR(_ZN3ccc7FF4x3y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y7E[];
extern void _ZN3ccc7FF4x3y73pqrEv();
extern void _ZN3ccc7FF4x3y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y7E[] = {
  {&(_ZTVN3ccc7FF4x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y7E[];
static VTBL_ENTRY alt_thunk_names1016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y7E = {  "_ZN3ccc7FF4x3y7E", // class name
  bases__ZN3ccc7FF4x3y7E, 2,
  &(vtc__ZN3ccc7FF4x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1016,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y8  : virtual ::ccc::EE4x3 {
  virtual void  efg(); // _ZN3ccc7FF4x3y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x3y83abcEv
  ~FF4x3y8(); // tgen
  FF4x3y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y83efgEv");}
void  ccc::FF4x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x3y83abcEv");}
ccc::FF4x3y8 ::~FF4x3y8(){ note_dtor("_ZN3ccc7FF4x3y8E", this);} // tgen
ccc::FF4x3y8 ::FF4x3y8(){ note_ctor("_ZN3ccc7FF4x3y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y8E, buf);
    ::ccc::FF4x3y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y8E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y8E);
    dp->::ccc::FF4x3y8::~FF4x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y8E(Test__ZN3ccc7FF4x3y8E, "_ZN3ccc7FF4x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y8C1Ev();
extern void _ZN3ccc7FF4x3y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y8E[] = {
  NSPAIR(_ZN3ccc7FF4x3y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x3y83abcEv();
extern void _ZN3ccc7FF4x3y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y8E[] = {
  {&(_ZTVN3ccc7FF4x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y8E[];
static VTBL_ENTRY alt_thunk_names1017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y8E = {  "_ZN3ccc7FF4x3y8E", // class name
  bases__ZN3ccc7FF4x3y8E, 2,
  &(vtc__ZN3ccc7FF4x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1017,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y9  : virtual ::ccc::EE4x3 {
  virtual void  efg(); // _ZN3ccc7FF4x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x3y93pqrEv
  ~FF4x3y9(); // tgen
  FF4x3y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x3y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x3y93efgEv");}
void  ccc::FF4x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x3y93pqrEv");}
ccc::FF4x3y9 ::~FF4x3y9(){ note_dtor("_ZN3ccc7FF4x3y9E", this);} // tgen
ccc::FF4x3y9 ::FF4x3y9(){ note_ctor("_ZN3ccc7FF4x3y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x3y9E, buf);
    ::ccc::FF4x3y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x3y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y9E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc7FF4x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x3y9E);
    dp->::ccc::FF4x3y9::~FF4x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x3y9E(Test__ZN3ccc7FF4x3y9E, "_ZN3ccc7FF4x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x3y9C1Ev();
extern void _ZN3ccc7FF4x3y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x3y9E[] = {
  NSPAIR(_ZN3ccc7FF4x3y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc7FF4x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y9E[];
extern void _ZN3ccc7FF4x3y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x3y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x3y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x3y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x3y9E[] = {
  {&(_ZTVN3ccc7FF4x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x3y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_7FF4x3y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x3y9E[];
static VTBL_ENTRY alt_thunk_names1018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x3y9E = {  "_ZN3ccc7FF4x3y9E", // class name
  bases__ZN3ccc7FF4x3y9E, 2,
  &(vtc__ZN3ccc7FF4x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x3y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x3y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x3y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x3y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1018,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y10  : virtual ::ccc::EE4x3 {
  virtual void  pqr(); // _ZN3ccc8FF4x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x3y103abcEv
  ~FF4x3y10(); // tgen
  FF4x3y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x3y103pqrEv");}
void  ccc::FF4x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x3y103abcEv");}
ccc::FF4x3y10 ::~FF4x3y10(){ note_dtor("_ZN3ccc8FF4x3y10E", this);} // tgen
ccc::FF4x3y10 ::FF4x3y10(){ note_ctor("_ZN3ccc8FF4x3y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y10E, buf);
    ::ccc::FF4x3y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y10E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y10E);
    dp->::ccc::FF4x3y10::~FF4x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y10E(Test__ZN3ccc8FF4x3y10E, "_ZN3ccc8FF4x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y10C1Ev();
extern void _ZN3ccc8FF4x3y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y10E[] = {
  NSPAIR(_ZN3ccc8FF4x3y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y10E[];
extern void _ZN3ccc8FF4x3y103pqrEv();
extern void _ZN3ccc8FF4x3y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y10E[] = {
  {&(_ZTVN3ccc8FF4x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y10E[];
static VTBL_ENTRY alt_thunk_names1019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y10E = {  "_ZN3ccc8FF4x3y10E", // class name
  bases__ZN3ccc8FF4x3y10E, 2,
  &(vtc__ZN3ccc8FF4x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1019,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y11  : virtual ::ccc::EE4x3 {
  virtual void  pqr(); // _ZN3ccc8FF4x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x3y113efgEv
  ~FF4x3y11(); // tgen
  FF4x3y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x3y113pqrEv");}
void  ccc::FF4x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x3y113efgEv");}
ccc::FF4x3y11 ::~FF4x3y11(){ note_dtor("_ZN3ccc8FF4x3y11E", this);} // tgen
ccc::FF4x3y11 ::FF4x3y11(){ note_ctor("_ZN3ccc8FF4x3y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y11E, buf);
    ::ccc::FF4x3y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y11E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y11E);
    dp->::ccc::FF4x3y11::~FF4x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y11E(Test__ZN3ccc8FF4x3y11E, "_ZN3ccc8FF4x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y11C1Ev();
extern void _ZN3ccc8FF4x3y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y11E[] = {
  NSPAIR(_ZN3ccc8FF4x3y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y11E[];
extern void _ZN3ccc8FF4x3y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x3y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y11E[] = {
  {&(_ZTVN3ccc8FF4x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y11E[];
static VTBL_ENTRY alt_thunk_names1020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y11E = {  "_ZN3ccc8FF4x3y11E", // class name
  bases__ZN3ccc8FF4x3y11E, 2,
  &(vtc__ZN3ccc8FF4x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1020,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y12  : virtual ::ccc::EE4x3 {
  virtual void  abc(); // _ZN3ccc8FF4x3y123abcEv
  ~FF4x3y12(); // tgen
  FF4x3y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x3y123abcEv");}
ccc::FF4x3y12 ::~FF4x3y12(){ note_dtor("_ZN3ccc8FF4x3y12E", this);} // tgen
ccc::FF4x3y12 ::FF4x3y12(){ note_ctor("_ZN3ccc8FF4x3y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y12E, buf);
    ::ccc::FF4x3y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y12E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y12E);
    dp->::ccc::FF4x3y12::~FF4x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y12E(Test__ZN3ccc8FF4x3y12E, "_ZN3ccc8FF4x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y12C1Ev();
extern void _ZN3ccc8FF4x3y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y12E[] = {
  NSPAIR(_ZN3ccc8FF4x3y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x3y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y12E[] = {
  {&(_ZTVN3ccc8FF4x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y12E[];
static VTBL_ENTRY alt_thunk_names1021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y12E = {  "_ZN3ccc8FF4x3y12E", // class name
  bases__ZN3ccc8FF4x3y12E, 2,
  &(vtc__ZN3ccc8FF4x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1021,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y13  : virtual ::ccc::EE4x3 {
  virtual void  efg(); // _ZN3ccc8FF4x3y133efgEv
  ~FF4x3y13(); // tgen
  FF4x3y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x3y133efgEv");}
ccc::FF4x3y13 ::~FF4x3y13(){ note_dtor("_ZN3ccc8FF4x3y13E", this);} // tgen
ccc::FF4x3y13 ::FF4x3y13(){ note_ctor("_ZN3ccc8FF4x3y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y13E, buf);
    ::ccc::FF4x3y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y13E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y13E);
    dp->::ccc::FF4x3y13::~FF4x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y13E(Test__ZN3ccc8FF4x3y13E, "_ZN3ccc8FF4x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y13C1Ev();
extern void _ZN3ccc8FF4x3y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y13E[] = {
  NSPAIR(_ZN3ccc8FF4x3y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x3y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y13E[] = {
  {&(_ZTVN3ccc8FF4x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y13E[];
static VTBL_ENTRY alt_thunk_names1022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y13E = {  "_ZN3ccc8FF4x3y13E", // class name
  bases__ZN3ccc8FF4x3y13E, 2,
  &(vtc__ZN3ccc8FF4x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1022,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y14  : virtual ::ccc::EE4x3 {
  virtual void  pqr(); // _ZN3ccc8FF4x3y143pqrEv
  ~FF4x3y14(); // tgen
  FF4x3y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x3y143pqrEv");}
ccc::FF4x3y14 ::~FF4x3y14(){ note_dtor("_ZN3ccc8FF4x3y14E", this);} // tgen
ccc::FF4x3y14 ::FF4x3y14(){ note_ctor("_ZN3ccc8FF4x3y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y14E, buf);
    ::ccc::FF4x3y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y14E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y14E);
    dp->::ccc::FF4x3y14::~FF4x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y14E(Test__ZN3ccc8FF4x3y14E, "_ZN3ccc8FF4x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y14C1Ev();
extern void _ZN3ccc8FF4x3y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y14E[] = {
  NSPAIR(_ZN3ccc8FF4x3y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y14E[];
extern void _ZN3ccc8FF4x3y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x3y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y14E[] = {
  {&(_ZTVN3ccc8FF4x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y14E[];
static VTBL_ENTRY alt_thunk_names1023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y14E = {  "_ZN3ccc8FF4x3y14E", // class name
  bases__ZN3ccc8FF4x3y14E, 2,
  &(vtc__ZN3ccc8FF4x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1023,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x3y15  : virtual ::ccc::EE4x3 {
  ~FF4x3y15(); // tgen
  FF4x3y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x3y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x3y15 ::~FF4x3y15(){ note_dtor("_ZN3ccc8FF4x3y15E", this);} // tgen
ccc::FF4x3y15 ::FF4x3y15(){ note_ctor("_ZN3ccc8FF4x3y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x3y15E, buf);
    ::ccc::FF4x3y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x3y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y15E");
    check_base_class_offset(lv, (::ccc::EE4x3*), 0, "_ZN3ccc8FF4x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x3y15E);
    dp->::ccc::FF4x3y15::~FF4x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x3y15E(Test__ZN3ccc8FF4x3y15E, "_ZN3ccc8FF4x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x3y15C1Ev();
extern void _ZN3ccc8FF4x3y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x3y15E[] = {
  NSPAIR(_ZN3ccc8FF4x3y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x3E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x3E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x3E[];
static Base_Class bases__ZN3ccc8FF4x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x3y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x3y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv)();
extern void _ZN3ccc5EE4x33pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv)();
extern void _ZN3ccc5EE4x33abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv)();
extern void _ZN3ccc5EE4x33efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x3y15E[] = {
  {&(_ZTVN3ccc8FF4x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x3y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x3E__NS_8FF4x3y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x3y15E[];
static VTBL_ENTRY alt_thunk_names1024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x33efgEv,_ZTv0_n20_N3ccc5EE4x33efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x33abcEv,_ZTv0_n16_N3ccc5EE4x33abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x33pqrEv,_ZTv0_n12_N3ccc5EE4x33pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x33pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x3y15E = {  "_ZN3ccc8FF4x3y15E", // class name
  bases__ZN3ccc8FF4x3y15E, 2,
  &(vtc__ZN3ccc8FF4x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x3y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x3y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x3y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x3y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1024,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y0  : virtual ::ccc::EE4x4 {
  virtual void  abc(); // _ZN3ccc7FF4x4y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y03pqrEv
  ~FF4x4y0(); // tgen
  FF4x4y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y03abcEv");}
void  ccc::FF4x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y03efgEv");}
void  ccc::FF4x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y03pqrEv");}
ccc::FF4x4y0 ::~FF4x4y0(){ note_dtor("_ZN3ccc7FF4x4y0E", this);} // tgen
ccc::FF4x4y0 ::FF4x4y0(){ note_ctor("_ZN3ccc7FF4x4y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y0E, buf);
    ::ccc::FF4x4y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y0E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y0E);
    dp->::ccc::FF4x4y0::~FF4x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y0E(Test__ZN3ccc7FF4x4y0E, "_ZN3ccc7FF4x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y0C1Ev();
extern void _ZN3ccc7FF4x4y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y0E[] = {
  NSPAIR(_ZN3ccc7FF4x4y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y0E[];
extern void _ZN3ccc7FF4x4y03pqrEv();
extern void _ZN3ccc7FF4x4y03abcEv();
extern void _ZN3ccc7FF4x4y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y0E[] = {
  {&(_ZTVN3ccc7FF4x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y0E[];
static VTBL_ENTRY alt_thunk_names1025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y0E = {  "_ZN3ccc7FF4x4y0E", // class name
  bases__ZN3ccc7FF4x4y0E, 2,
  &(vtc__ZN3ccc7FF4x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1025,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y1  : virtual ::ccc::EE4x4 {
  virtual void  abc(); // _ZN3ccc7FF4x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x4y13efgEv
  ~FF4x4y1(); // tgen
  FF4x4y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y13abcEv");}
void  ccc::FF4x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y13pqrEv");}
void  ccc::FF4x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y13efgEv");}
ccc::FF4x4y1 ::~FF4x4y1(){ note_dtor("_ZN3ccc7FF4x4y1E", this);} // tgen
ccc::FF4x4y1 ::FF4x4y1(){ note_ctor("_ZN3ccc7FF4x4y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y1E, buf);
    ::ccc::FF4x4y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y1E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y1E);
    dp->::ccc::FF4x4y1::~FF4x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y1E(Test__ZN3ccc7FF4x4y1E, "_ZN3ccc7FF4x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y1C1Ev();
extern void _ZN3ccc7FF4x4y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y1E[] = {
  NSPAIR(_ZN3ccc7FF4x4y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y1E[];
extern void _ZN3ccc7FF4x4y13pqrEv();
extern void _ZN3ccc7FF4x4y13abcEv();
extern void _ZN3ccc7FF4x4y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y1E[] = {
  {&(_ZTVN3ccc7FF4x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y1E[];
static VTBL_ENTRY alt_thunk_names1026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y1E = {  "_ZN3ccc7FF4x4y1E", // class name
  bases__ZN3ccc7FF4x4y1E, 2,
  &(vtc__ZN3ccc7FF4x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1026,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y2  : virtual ::ccc::EE4x4 {
  virtual void  efg(); // _ZN3ccc7FF4x4y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y23pqrEv
  ~FF4x4y2(); // tgen
  FF4x4y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y23efgEv");}
void  ccc::FF4x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y23abcEv");}
void  ccc::FF4x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y23pqrEv");}
ccc::FF4x4y2 ::~FF4x4y2(){ note_dtor("_ZN3ccc7FF4x4y2E", this);} // tgen
ccc::FF4x4y2 ::FF4x4y2(){ note_ctor("_ZN3ccc7FF4x4y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y2E, buf);
    ::ccc::FF4x4y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y2E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y2E);
    dp->::ccc::FF4x4y2::~FF4x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y2E(Test__ZN3ccc7FF4x4y2E, "_ZN3ccc7FF4x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y2C1Ev();
extern void _ZN3ccc7FF4x4y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y2E[] = {
  NSPAIR(_ZN3ccc7FF4x4y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y2E[];
extern void _ZN3ccc7FF4x4y23pqrEv();
extern void _ZN3ccc7FF4x4y23abcEv();
extern void _ZN3ccc7FF4x4y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y2E[] = {
  {&(_ZTVN3ccc7FF4x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y2E[];
static VTBL_ENTRY alt_thunk_names1027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y2E = {  "_ZN3ccc7FF4x4y2E", // class name
  bases__ZN3ccc7FF4x4y2E, 2,
  &(vtc__ZN3ccc7FF4x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1027,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y3  : virtual ::ccc::EE4x4 {
  virtual void  efg(); // _ZN3ccc7FF4x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x4y33abcEv
  ~FF4x4y3(); // tgen
  FF4x4y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y33efgEv");}
void  ccc::FF4x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y33pqrEv");}
void  ccc::FF4x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y33abcEv");}
ccc::FF4x4y3 ::~FF4x4y3(){ note_dtor("_ZN3ccc7FF4x4y3E", this);} // tgen
ccc::FF4x4y3 ::FF4x4y3(){ note_ctor("_ZN3ccc7FF4x4y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y3E, buf);
    ::ccc::FF4x4y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y3E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y3E);
    dp->::ccc::FF4x4y3::~FF4x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y3E(Test__ZN3ccc7FF4x4y3E, "_ZN3ccc7FF4x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y3C1Ev();
extern void _ZN3ccc7FF4x4y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y3E[] = {
  NSPAIR(_ZN3ccc7FF4x4y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y3E[];
extern void _ZN3ccc7FF4x4y33pqrEv();
extern void _ZN3ccc7FF4x4y33abcEv();
extern void _ZN3ccc7FF4x4y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y3E[] = {
  {&(_ZTVN3ccc7FF4x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y3E[];
static VTBL_ENTRY alt_thunk_names1028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y3E = {  "_ZN3ccc7FF4x4y3E", // class name
  bases__ZN3ccc7FF4x4y3E, 2,
  &(vtc__ZN3ccc7FF4x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1028,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y4  : virtual ::ccc::EE4x4 {
  virtual void  pqr(); // _ZN3ccc7FF4x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x4y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x4y43efgEv
  ~FF4x4y4(); // tgen
  FF4x4y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y43pqrEv");}
void  ccc::FF4x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y43abcEv");}
void  ccc::FF4x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y43efgEv");}
ccc::FF4x4y4 ::~FF4x4y4(){ note_dtor("_ZN3ccc7FF4x4y4E", this);} // tgen
ccc::FF4x4y4 ::FF4x4y4(){ note_ctor("_ZN3ccc7FF4x4y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y4E, buf);
    ::ccc::FF4x4y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y4E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y4E);
    dp->::ccc::FF4x4y4::~FF4x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y4E(Test__ZN3ccc7FF4x4y4E, "_ZN3ccc7FF4x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y4C1Ev();
extern void _ZN3ccc7FF4x4y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y4E[] = {
  NSPAIR(_ZN3ccc7FF4x4y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y4E[];
extern void _ZN3ccc7FF4x4y43pqrEv();
extern void _ZN3ccc7FF4x4y43abcEv();
extern void _ZN3ccc7FF4x4y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y4E[] = {
  {&(_ZTVN3ccc7FF4x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y4E[];
static VTBL_ENTRY alt_thunk_names1029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y4E = {  "_ZN3ccc7FF4x4y4E", // class name
  bases__ZN3ccc7FF4x4y4E, 2,
  &(vtc__ZN3ccc7FF4x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1029,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y5  : virtual ::ccc::EE4x4 {
  virtual void  pqr(); // _ZN3ccc7FF4x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x4y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x4y53abcEv
  ~FF4x4y5(); // tgen
  FF4x4y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y53pqrEv");}
void  ccc::FF4x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y53efgEv");}
void  ccc::FF4x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y53abcEv");}
ccc::FF4x4y5 ::~FF4x4y5(){ note_dtor("_ZN3ccc7FF4x4y5E", this);} // tgen
ccc::FF4x4y5 ::FF4x4y5(){ note_ctor("_ZN3ccc7FF4x4y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y5E, buf);
    ::ccc::FF4x4y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y5E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y5E);
    dp->::ccc::FF4x4y5::~FF4x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y5E(Test__ZN3ccc7FF4x4y5E, "_ZN3ccc7FF4x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y5C1Ev();
extern void _ZN3ccc7FF4x4y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y5E[] = {
  NSPAIR(_ZN3ccc7FF4x4y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y5E[];
extern void _ZN3ccc7FF4x4y53pqrEv();
extern void _ZN3ccc7FF4x4y53abcEv();
extern void _ZN3ccc7FF4x4y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y5E[] = {
  {&(_ZTVN3ccc7FF4x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y5E[];
static VTBL_ENTRY alt_thunk_names1030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y5E = {  "_ZN3ccc7FF4x4y5E", // class name
  bases__ZN3ccc7FF4x4y5E, 2,
  &(vtc__ZN3ccc7FF4x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1030,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y6  : virtual ::ccc::EE4x4 {
  virtual void  abc(); // _ZN3ccc7FF4x4y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x4y63efgEv
  ~FF4x4y6(); // tgen
  FF4x4y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y63abcEv");}
void  ccc::FF4x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y63efgEv");}
ccc::FF4x4y6 ::~FF4x4y6(){ note_dtor("_ZN3ccc7FF4x4y6E", this);} // tgen
ccc::FF4x4y6 ::FF4x4y6(){ note_ctor("_ZN3ccc7FF4x4y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y6E, buf);
    ::ccc::FF4x4y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y6E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y6E);
    dp->::ccc::FF4x4y6::~FF4x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y6E(Test__ZN3ccc7FF4x4y6E, "_ZN3ccc7FF4x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y6C1Ev();
extern void _ZN3ccc7FF4x4y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y6E[] = {
  NSPAIR(_ZN3ccc7FF4x4y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x4y63abcEv();
extern void _ZN3ccc7FF4x4y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y6E[] = {
  {&(_ZTVN3ccc7FF4x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y6E[];
static VTBL_ENTRY alt_thunk_names1031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y6E = {  "_ZN3ccc7FF4x4y6E", // class name
  bases__ZN3ccc7FF4x4y6E, 2,
  &(vtc__ZN3ccc7FF4x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1031,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y7  : virtual ::ccc::EE4x4 {
  virtual void  abc(); // _ZN3ccc7FF4x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y73pqrEv
  ~FF4x4y7(); // tgen
  FF4x4y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y73abcEv");}
void  ccc::FF4x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y73pqrEv");}
ccc::FF4x4y7 ::~FF4x4y7(){ note_dtor("_ZN3ccc7FF4x4y7E", this);} // tgen
ccc::FF4x4y7 ::FF4x4y7(){ note_ctor("_ZN3ccc7FF4x4y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y7E, buf);
    ::ccc::FF4x4y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y7E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y7E);
    dp->::ccc::FF4x4y7::~FF4x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y7E(Test__ZN3ccc7FF4x4y7E, "_ZN3ccc7FF4x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y7C1Ev();
extern void _ZN3ccc7FF4x4y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y7E[] = {
  NSPAIR(_ZN3ccc7FF4x4y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y7E[];
extern void _ZN3ccc7FF4x4y73pqrEv();
extern void _ZN3ccc7FF4x4y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y7E[] = {
  {&(_ZTVN3ccc7FF4x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y7E[];
static VTBL_ENTRY alt_thunk_names1032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y7E = {  "_ZN3ccc7FF4x4y7E", // class name
  bases__ZN3ccc7FF4x4y7E, 2,
  &(vtc__ZN3ccc7FF4x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1032,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y8  : virtual ::ccc::EE4x4 {
  virtual void  efg(); // _ZN3ccc7FF4x4y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x4y83abcEv
  ~FF4x4y8(); // tgen
  FF4x4y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y83efgEv");}
void  ccc::FF4x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x4y83abcEv");}
ccc::FF4x4y8 ::~FF4x4y8(){ note_dtor("_ZN3ccc7FF4x4y8E", this);} // tgen
ccc::FF4x4y8 ::FF4x4y8(){ note_ctor("_ZN3ccc7FF4x4y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y8E, buf);
    ::ccc::FF4x4y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y8E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y8E);
    dp->::ccc::FF4x4y8::~FF4x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y8E(Test__ZN3ccc7FF4x4y8E, "_ZN3ccc7FF4x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y8C1Ev();
extern void _ZN3ccc7FF4x4y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y8E[] = {
  NSPAIR(_ZN3ccc7FF4x4y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x4y83abcEv();
extern void _ZN3ccc7FF4x4y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y8E[] = {
  {&(_ZTVN3ccc7FF4x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y8E[];
static VTBL_ENTRY alt_thunk_names1033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y8E = {  "_ZN3ccc7FF4x4y8E", // class name
  bases__ZN3ccc7FF4x4y8E, 2,
  &(vtc__ZN3ccc7FF4x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1033,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y9  : virtual ::ccc::EE4x4 {
  virtual void  efg(); // _ZN3ccc7FF4x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x4y93pqrEv
  ~FF4x4y9(); // tgen
  FF4x4y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x4y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x4y93efgEv");}
void  ccc::FF4x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x4y93pqrEv");}
ccc::FF4x4y9 ::~FF4x4y9(){ note_dtor("_ZN3ccc7FF4x4y9E", this);} // tgen
ccc::FF4x4y9 ::FF4x4y9(){ note_ctor("_ZN3ccc7FF4x4y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x4y9E, buf);
    ::ccc::FF4x4y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x4y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y9E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc7FF4x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x4y9E);
    dp->::ccc::FF4x4y9::~FF4x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x4y9E(Test__ZN3ccc7FF4x4y9E, "_ZN3ccc7FF4x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x4y9C1Ev();
extern void _ZN3ccc7FF4x4y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x4y9E[] = {
  NSPAIR(_ZN3ccc7FF4x4y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc7FF4x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y9E[];
extern void _ZN3ccc7FF4x4y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x4y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x4y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x4y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x4y9E[] = {
  {&(_ZTVN3ccc7FF4x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x4y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_7FF4x4y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x4y9E[];
static VTBL_ENTRY alt_thunk_names1034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x4y9E = {  "_ZN3ccc7FF4x4y9E", // class name
  bases__ZN3ccc7FF4x4y9E, 2,
  &(vtc__ZN3ccc7FF4x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x4y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x4y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x4y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x4y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1034,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y10  : virtual ::ccc::EE4x4 {
  virtual void  pqr(); // _ZN3ccc8FF4x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x4y103abcEv
  ~FF4x4y10(); // tgen
  FF4x4y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x4y103pqrEv");}
void  ccc::FF4x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x4y103abcEv");}
ccc::FF4x4y10 ::~FF4x4y10(){ note_dtor("_ZN3ccc8FF4x4y10E", this);} // tgen
ccc::FF4x4y10 ::FF4x4y10(){ note_ctor("_ZN3ccc8FF4x4y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y10E, buf);
    ::ccc::FF4x4y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y10E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y10E);
    dp->::ccc::FF4x4y10::~FF4x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y10E(Test__ZN3ccc8FF4x4y10E, "_ZN3ccc8FF4x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y10C1Ev();
extern void _ZN3ccc8FF4x4y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y10E[] = {
  NSPAIR(_ZN3ccc8FF4x4y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y10E[];
extern void _ZN3ccc8FF4x4y103pqrEv();
extern void _ZN3ccc8FF4x4y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y10E[] = {
  {&(_ZTVN3ccc8FF4x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y10E[];
static VTBL_ENTRY alt_thunk_names1035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y10E = {  "_ZN3ccc8FF4x4y10E", // class name
  bases__ZN3ccc8FF4x4y10E, 2,
  &(vtc__ZN3ccc8FF4x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1035,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y11  : virtual ::ccc::EE4x4 {
  virtual void  pqr(); // _ZN3ccc8FF4x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x4y113efgEv
  ~FF4x4y11(); // tgen
  FF4x4y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x4y113pqrEv");}
void  ccc::FF4x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x4y113efgEv");}
ccc::FF4x4y11 ::~FF4x4y11(){ note_dtor("_ZN3ccc8FF4x4y11E", this);} // tgen
ccc::FF4x4y11 ::FF4x4y11(){ note_ctor("_ZN3ccc8FF4x4y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y11E, buf);
    ::ccc::FF4x4y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y11E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y11E);
    dp->::ccc::FF4x4y11::~FF4x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y11E(Test__ZN3ccc8FF4x4y11E, "_ZN3ccc8FF4x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y11C1Ev();
extern void _ZN3ccc8FF4x4y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y11E[] = {
  NSPAIR(_ZN3ccc8FF4x4y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y11E[];
extern void _ZN3ccc8FF4x4y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x4y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y11E[] = {
  {&(_ZTVN3ccc8FF4x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y11E[];
static VTBL_ENTRY alt_thunk_names1036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y11E = {  "_ZN3ccc8FF4x4y11E", // class name
  bases__ZN3ccc8FF4x4y11E, 2,
  &(vtc__ZN3ccc8FF4x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1036,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y12  : virtual ::ccc::EE4x4 {
  virtual void  abc(); // _ZN3ccc8FF4x4y123abcEv
  ~FF4x4y12(); // tgen
  FF4x4y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x4y123abcEv");}
ccc::FF4x4y12 ::~FF4x4y12(){ note_dtor("_ZN3ccc8FF4x4y12E", this);} // tgen
ccc::FF4x4y12 ::FF4x4y12(){ note_ctor("_ZN3ccc8FF4x4y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y12E, buf);
    ::ccc::FF4x4y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y12E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y12E);
    dp->::ccc::FF4x4y12::~FF4x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y12E(Test__ZN3ccc8FF4x4y12E, "_ZN3ccc8FF4x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y12C1Ev();
extern void _ZN3ccc8FF4x4y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y12E[] = {
  NSPAIR(_ZN3ccc8FF4x4y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x4y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y12E[] = {
  {&(_ZTVN3ccc8FF4x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y12E[];
static VTBL_ENTRY alt_thunk_names1037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y12E = {  "_ZN3ccc8FF4x4y12E", // class name
  bases__ZN3ccc8FF4x4y12E, 2,
  &(vtc__ZN3ccc8FF4x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1037,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y13  : virtual ::ccc::EE4x4 {
  virtual void  efg(); // _ZN3ccc8FF4x4y133efgEv
  ~FF4x4y13(); // tgen
  FF4x4y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x4y133efgEv");}
ccc::FF4x4y13 ::~FF4x4y13(){ note_dtor("_ZN3ccc8FF4x4y13E", this);} // tgen
ccc::FF4x4y13 ::FF4x4y13(){ note_ctor("_ZN3ccc8FF4x4y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y13E, buf);
    ::ccc::FF4x4y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y13E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y13E);
    dp->::ccc::FF4x4y13::~FF4x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y13E(Test__ZN3ccc8FF4x4y13E, "_ZN3ccc8FF4x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y13C1Ev();
extern void _ZN3ccc8FF4x4y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y13E[] = {
  NSPAIR(_ZN3ccc8FF4x4y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x4y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y13E[] = {
  {&(_ZTVN3ccc8FF4x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y13E[];
static VTBL_ENTRY alt_thunk_names1038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y13E = {  "_ZN3ccc8FF4x4y13E", // class name
  bases__ZN3ccc8FF4x4y13E, 2,
  &(vtc__ZN3ccc8FF4x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1038,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y14  : virtual ::ccc::EE4x4 {
  virtual void  pqr(); // _ZN3ccc8FF4x4y143pqrEv
  ~FF4x4y14(); // tgen
  FF4x4y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x4y143pqrEv");}
ccc::FF4x4y14 ::~FF4x4y14(){ note_dtor("_ZN3ccc8FF4x4y14E", this);} // tgen
ccc::FF4x4y14 ::FF4x4y14(){ note_ctor("_ZN3ccc8FF4x4y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y14E, buf);
    ::ccc::FF4x4y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y14E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y14E);
    dp->::ccc::FF4x4y14::~FF4x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y14E(Test__ZN3ccc8FF4x4y14E, "_ZN3ccc8FF4x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y14C1Ev();
extern void _ZN3ccc8FF4x4y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y14E[] = {
  NSPAIR(_ZN3ccc8FF4x4y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y14E[];
extern void _ZN3ccc8FF4x4y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x4y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y14E[] = {
  {&(_ZTVN3ccc8FF4x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y14E[];
static VTBL_ENTRY alt_thunk_names1039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y14E = {  "_ZN3ccc8FF4x4y14E", // class name
  bases__ZN3ccc8FF4x4y14E, 2,
  &(vtc__ZN3ccc8FF4x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1039,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x4y15  : virtual ::ccc::EE4x4 {
  ~FF4x4y15(); // tgen
  FF4x4y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x4y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x4y15 ::~FF4x4y15(){ note_dtor("_ZN3ccc8FF4x4y15E", this);} // tgen
ccc::FF4x4y15 ::FF4x4y15(){ note_ctor("_ZN3ccc8FF4x4y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x4y15E, buf);
    ::ccc::FF4x4y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x4y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y15E");
    check_base_class_offset(lv, (::ccc::EE4x4*), 0, "_ZN3ccc8FF4x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x4y15E);
    dp->::ccc::FF4x4y15::~FF4x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x4y15E(Test__ZN3ccc8FF4x4y15E, "_ZN3ccc8FF4x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x4y15C1Ev();
extern void _ZN3ccc8FF4x4y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x4y15E[] = {
  NSPAIR(_ZN3ccc8FF4x4y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x4E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x4E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x4E[];
static Base_Class bases__ZN3ccc8FF4x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x4y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x4y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv)();
extern void _ZN3ccc5EE4x43pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv)();
extern void _ZN3ccc5EE4x43abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv)();
extern void _ZN3ccc5EE4x43efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x4y15E[] = {
  {&(_ZTVN3ccc8FF4x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x4y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x4E__NS_8FF4x4y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x4y15E[];
static VTBL_ENTRY alt_thunk_names1040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x43efgEv,_ZTv0_n20_N3ccc5EE4x43efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x43abcEv,_ZTv0_n16_N3ccc5EE4x43abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x43pqrEv,_ZTv0_n12_N3ccc5EE4x43pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x43pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x4y15E = {  "_ZN3ccc8FF4x4y15E", // class name
  bases__ZN3ccc8FF4x4y15E, 2,
  &(vtc__ZN3ccc8FF4x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x4y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x4y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x4y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x4y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1040,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y0  : virtual ::ccc::EE4x5 {
  virtual void  abc(); // _ZN3ccc7FF4x5y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y03pqrEv
  ~FF4x5y0(); // tgen
  FF4x5y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y03abcEv");}
void  ccc::FF4x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y03efgEv");}
void  ccc::FF4x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y03pqrEv");}
ccc::FF4x5y0 ::~FF4x5y0(){ note_dtor("_ZN3ccc7FF4x5y0E", this);} // tgen
ccc::FF4x5y0 ::FF4x5y0(){ note_ctor("_ZN3ccc7FF4x5y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y0E, buf);
    ::ccc::FF4x5y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y0E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y0E);
    dp->::ccc::FF4x5y0::~FF4x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y0E(Test__ZN3ccc7FF4x5y0E, "_ZN3ccc7FF4x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y0C1Ev();
extern void _ZN3ccc7FF4x5y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y0E[] = {
  NSPAIR(_ZN3ccc7FF4x5y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y0E[];
extern void _ZN3ccc7FF4x5y03pqrEv();
extern void _ZN3ccc7FF4x5y03abcEv();
extern void _ZN3ccc7FF4x5y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y0E[] = {
  {&(_ZTVN3ccc7FF4x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y0E[];
static VTBL_ENTRY alt_thunk_names1041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y0E = {  "_ZN3ccc7FF4x5y0E", // class name
  bases__ZN3ccc7FF4x5y0E, 2,
  &(vtc__ZN3ccc7FF4x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1041,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y1  : virtual ::ccc::EE4x5 {
  virtual void  abc(); // _ZN3ccc7FF4x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x5y13efgEv
  ~FF4x5y1(); // tgen
  FF4x5y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y13abcEv");}
void  ccc::FF4x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y13pqrEv");}
void  ccc::FF4x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y13efgEv");}
ccc::FF4x5y1 ::~FF4x5y1(){ note_dtor("_ZN3ccc7FF4x5y1E", this);} // tgen
ccc::FF4x5y1 ::FF4x5y1(){ note_ctor("_ZN3ccc7FF4x5y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y1E, buf);
    ::ccc::FF4x5y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y1E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y1E);
    dp->::ccc::FF4x5y1::~FF4x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y1E(Test__ZN3ccc7FF4x5y1E, "_ZN3ccc7FF4x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y1C1Ev();
extern void _ZN3ccc7FF4x5y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y1E[] = {
  NSPAIR(_ZN3ccc7FF4x5y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y1E[];
extern void _ZN3ccc7FF4x5y13pqrEv();
extern void _ZN3ccc7FF4x5y13abcEv();
extern void _ZN3ccc7FF4x5y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y1E[] = {
  {&(_ZTVN3ccc7FF4x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y1E[];
static VTBL_ENTRY alt_thunk_names1042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y1E = {  "_ZN3ccc7FF4x5y1E", // class name
  bases__ZN3ccc7FF4x5y1E, 2,
  &(vtc__ZN3ccc7FF4x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1042,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y2  : virtual ::ccc::EE4x5 {
  virtual void  efg(); // _ZN3ccc7FF4x5y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y23pqrEv
  ~FF4x5y2(); // tgen
  FF4x5y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y23efgEv");}
void  ccc::FF4x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y23abcEv");}
void  ccc::FF4x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y23pqrEv");}
ccc::FF4x5y2 ::~FF4x5y2(){ note_dtor("_ZN3ccc7FF4x5y2E", this);} // tgen
ccc::FF4x5y2 ::FF4x5y2(){ note_ctor("_ZN3ccc7FF4x5y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y2E, buf);
    ::ccc::FF4x5y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y2E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y2E);
    dp->::ccc::FF4x5y2::~FF4x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y2E(Test__ZN3ccc7FF4x5y2E, "_ZN3ccc7FF4x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y2C1Ev();
extern void _ZN3ccc7FF4x5y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y2E[] = {
  NSPAIR(_ZN3ccc7FF4x5y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y2E[];
extern void _ZN3ccc7FF4x5y23pqrEv();
extern void _ZN3ccc7FF4x5y23abcEv();
extern void _ZN3ccc7FF4x5y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y2E[] = {
  {&(_ZTVN3ccc7FF4x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y2E[];
static VTBL_ENTRY alt_thunk_names1043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y2E = {  "_ZN3ccc7FF4x5y2E", // class name
  bases__ZN3ccc7FF4x5y2E, 2,
  &(vtc__ZN3ccc7FF4x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1043,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y3  : virtual ::ccc::EE4x5 {
  virtual void  efg(); // _ZN3ccc7FF4x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x5y33abcEv
  ~FF4x5y3(); // tgen
  FF4x5y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y33efgEv");}
void  ccc::FF4x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y33pqrEv");}
void  ccc::FF4x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y33abcEv");}
ccc::FF4x5y3 ::~FF4x5y3(){ note_dtor("_ZN3ccc7FF4x5y3E", this);} // tgen
ccc::FF4x5y3 ::FF4x5y3(){ note_ctor("_ZN3ccc7FF4x5y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y3E, buf);
    ::ccc::FF4x5y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y3E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y3E);
    dp->::ccc::FF4x5y3::~FF4x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y3E(Test__ZN3ccc7FF4x5y3E, "_ZN3ccc7FF4x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y3C1Ev();
extern void _ZN3ccc7FF4x5y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y3E[] = {
  NSPAIR(_ZN3ccc7FF4x5y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y3E[];
extern void _ZN3ccc7FF4x5y33pqrEv();
extern void _ZN3ccc7FF4x5y33abcEv();
extern void _ZN3ccc7FF4x5y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y3E[] = {
  {&(_ZTVN3ccc7FF4x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y3E[];
static VTBL_ENTRY alt_thunk_names1044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y3E = {  "_ZN3ccc7FF4x5y3E", // class name
  bases__ZN3ccc7FF4x5y3E, 2,
  &(vtc__ZN3ccc7FF4x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1044,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y4  : virtual ::ccc::EE4x5 {
  virtual void  pqr(); // _ZN3ccc7FF4x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x5y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x5y43efgEv
  ~FF4x5y4(); // tgen
  FF4x5y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y43pqrEv");}
void  ccc::FF4x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y43abcEv");}
void  ccc::FF4x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y43efgEv");}
ccc::FF4x5y4 ::~FF4x5y4(){ note_dtor("_ZN3ccc7FF4x5y4E", this);} // tgen
ccc::FF4x5y4 ::FF4x5y4(){ note_ctor("_ZN3ccc7FF4x5y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y4E, buf);
    ::ccc::FF4x5y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y4E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y4E);
    dp->::ccc::FF4x5y4::~FF4x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y4E(Test__ZN3ccc7FF4x5y4E, "_ZN3ccc7FF4x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y4C1Ev();
extern void _ZN3ccc7FF4x5y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y4E[] = {
  NSPAIR(_ZN3ccc7FF4x5y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y4E[];
extern void _ZN3ccc7FF4x5y43pqrEv();
extern void _ZN3ccc7FF4x5y43abcEv();
extern void _ZN3ccc7FF4x5y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y4E[] = {
  {&(_ZTVN3ccc7FF4x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y4E[];
static VTBL_ENTRY alt_thunk_names1045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y4E = {  "_ZN3ccc7FF4x5y4E", // class name
  bases__ZN3ccc7FF4x5y4E, 2,
  &(vtc__ZN3ccc7FF4x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1045,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y5  : virtual ::ccc::EE4x5 {
  virtual void  pqr(); // _ZN3ccc7FF4x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x5y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x5y53abcEv
  ~FF4x5y5(); // tgen
  FF4x5y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y53pqrEv");}
void  ccc::FF4x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y53efgEv");}
void  ccc::FF4x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y53abcEv");}
ccc::FF4x5y5 ::~FF4x5y5(){ note_dtor("_ZN3ccc7FF4x5y5E", this);} // tgen
ccc::FF4x5y5 ::FF4x5y5(){ note_ctor("_ZN3ccc7FF4x5y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y5E, buf);
    ::ccc::FF4x5y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y5E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y5E);
    dp->::ccc::FF4x5y5::~FF4x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y5E(Test__ZN3ccc7FF4x5y5E, "_ZN3ccc7FF4x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y5C1Ev();
extern void _ZN3ccc7FF4x5y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y5E[] = {
  NSPAIR(_ZN3ccc7FF4x5y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y5E[];
extern void _ZN3ccc7FF4x5y53pqrEv();
extern void _ZN3ccc7FF4x5y53abcEv();
extern void _ZN3ccc7FF4x5y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y5E[] = {
  {&(_ZTVN3ccc7FF4x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y5E[];
static VTBL_ENTRY alt_thunk_names1046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y5E = {  "_ZN3ccc7FF4x5y5E", // class name
  bases__ZN3ccc7FF4x5y5E, 2,
  &(vtc__ZN3ccc7FF4x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1046,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y6  : virtual ::ccc::EE4x5 {
  virtual void  abc(); // _ZN3ccc7FF4x5y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x5y63efgEv
  ~FF4x5y6(); // tgen
  FF4x5y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y63abcEv");}
void  ccc::FF4x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y63efgEv");}
ccc::FF4x5y6 ::~FF4x5y6(){ note_dtor("_ZN3ccc7FF4x5y6E", this);} // tgen
ccc::FF4x5y6 ::FF4x5y6(){ note_ctor("_ZN3ccc7FF4x5y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y6E, buf);
    ::ccc::FF4x5y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y6E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y6E);
    dp->::ccc::FF4x5y6::~FF4x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y6E(Test__ZN3ccc7FF4x5y6E, "_ZN3ccc7FF4x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y6C1Ev();
extern void _ZN3ccc7FF4x5y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y6E[] = {
  NSPAIR(_ZN3ccc7FF4x5y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x5y63abcEv();
extern void _ZN3ccc7FF4x5y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y6E[] = {
  {&(_ZTVN3ccc7FF4x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y6E[];
static VTBL_ENTRY alt_thunk_names1047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y6E = {  "_ZN3ccc7FF4x5y6E", // class name
  bases__ZN3ccc7FF4x5y6E, 2,
  &(vtc__ZN3ccc7FF4x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1047,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y7  : virtual ::ccc::EE4x5 {
  virtual void  abc(); // _ZN3ccc7FF4x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y73pqrEv
  ~FF4x5y7(); // tgen
  FF4x5y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y73abcEv");}
void  ccc::FF4x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y73pqrEv");}
ccc::FF4x5y7 ::~FF4x5y7(){ note_dtor("_ZN3ccc7FF4x5y7E", this);} // tgen
ccc::FF4x5y7 ::FF4x5y7(){ note_ctor("_ZN3ccc7FF4x5y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y7E, buf);
    ::ccc::FF4x5y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y7E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y7E);
    dp->::ccc::FF4x5y7::~FF4x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y7E(Test__ZN3ccc7FF4x5y7E, "_ZN3ccc7FF4x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y7C1Ev();
extern void _ZN3ccc7FF4x5y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y7E[] = {
  NSPAIR(_ZN3ccc7FF4x5y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y7E[];
extern void _ZN3ccc7FF4x5y73pqrEv();
extern void _ZN3ccc7FF4x5y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y7E[] = {
  {&(_ZTVN3ccc7FF4x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y7E[];
static VTBL_ENTRY alt_thunk_names1048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y7E = {  "_ZN3ccc7FF4x5y7E", // class name
  bases__ZN3ccc7FF4x5y7E, 2,
  &(vtc__ZN3ccc7FF4x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1048,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y8  : virtual ::ccc::EE4x5 {
  virtual void  efg(); // _ZN3ccc7FF4x5y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x5y83abcEv
  ~FF4x5y8(); // tgen
  FF4x5y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y83efgEv");}
void  ccc::FF4x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x5y83abcEv");}
ccc::FF4x5y8 ::~FF4x5y8(){ note_dtor("_ZN3ccc7FF4x5y8E", this);} // tgen
ccc::FF4x5y8 ::FF4x5y8(){ note_ctor("_ZN3ccc7FF4x5y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y8E, buf);
    ::ccc::FF4x5y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y8E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y8E);
    dp->::ccc::FF4x5y8::~FF4x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y8E(Test__ZN3ccc7FF4x5y8E, "_ZN3ccc7FF4x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y8C1Ev();
extern void _ZN3ccc7FF4x5y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y8E[] = {
  NSPAIR(_ZN3ccc7FF4x5y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x5y83abcEv();
extern void _ZN3ccc7FF4x5y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y8E[] = {
  {&(_ZTVN3ccc7FF4x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y8E[];
static VTBL_ENTRY alt_thunk_names1049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y8E = {  "_ZN3ccc7FF4x5y8E", // class name
  bases__ZN3ccc7FF4x5y8E, 2,
  &(vtc__ZN3ccc7FF4x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1049,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y9  : virtual ::ccc::EE4x5 {
  virtual void  efg(); // _ZN3ccc7FF4x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x5y93pqrEv
  ~FF4x5y9(); // tgen
  FF4x5y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x5y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x5y93efgEv");}
void  ccc::FF4x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x5y93pqrEv");}
ccc::FF4x5y9 ::~FF4x5y9(){ note_dtor("_ZN3ccc7FF4x5y9E", this);} // tgen
ccc::FF4x5y9 ::FF4x5y9(){ note_ctor("_ZN3ccc7FF4x5y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x5y9E, buf);
    ::ccc::FF4x5y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x5y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y9E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc7FF4x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x5y9E);
    dp->::ccc::FF4x5y9::~FF4x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x5y9E(Test__ZN3ccc7FF4x5y9E, "_ZN3ccc7FF4x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x5y9C1Ev();
extern void _ZN3ccc7FF4x5y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x5y9E[] = {
  NSPAIR(_ZN3ccc7FF4x5y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc7FF4x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y9E[];
extern void _ZN3ccc7FF4x5y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x5y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x5y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x5y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x5y9E[] = {
  {&(_ZTVN3ccc7FF4x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x5y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_7FF4x5y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x5y9E[];
static VTBL_ENTRY alt_thunk_names1050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x5y9E = {  "_ZN3ccc7FF4x5y9E", // class name
  bases__ZN3ccc7FF4x5y9E, 2,
  &(vtc__ZN3ccc7FF4x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x5y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x5y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x5y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x5y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1050,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y10  : virtual ::ccc::EE4x5 {
  virtual void  pqr(); // _ZN3ccc8FF4x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x5y103abcEv
  ~FF4x5y10(); // tgen
  FF4x5y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x5y103pqrEv");}
void  ccc::FF4x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x5y103abcEv");}
ccc::FF4x5y10 ::~FF4x5y10(){ note_dtor("_ZN3ccc8FF4x5y10E", this);} // tgen
ccc::FF4x5y10 ::FF4x5y10(){ note_ctor("_ZN3ccc8FF4x5y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y10E, buf);
    ::ccc::FF4x5y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y10E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y10E);
    dp->::ccc::FF4x5y10::~FF4x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y10E(Test__ZN3ccc8FF4x5y10E, "_ZN3ccc8FF4x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y10C1Ev();
extern void _ZN3ccc8FF4x5y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y10E[] = {
  NSPAIR(_ZN3ccc8FF4x5y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y10E[];
extern void _ZN3ccc8FF4x5y103pqrEv();
extern void _ZN3ccc8FF4x5y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y10E[] = {
  {&(_ZTVN3ccc8FF4x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y10E[];
static VTBL_ENTRY alt_thunk_names1051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y10E = {  "_ZN3ccc8FF4x5y10E", // class name
  bases__ZN3ccc8FF4x5y10E, 2,
  &(vtc__ZN3ccc8FF4x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1051,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y11  : virtual ::ccc::EE4x5 {
  virtual void  pqr(); // _ZN3ccc8FF4x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x5y113efgEv
  ~FF4x5y11(); // tgen
  FF4x5y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x5y113pqrEv");}
void  ccc::FF4x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x5y113efgEv");}
ccc::FF4x5y11 ::~FF4x5y11(){ note_dtor("_ZN3ccc8FF4x5y11E", this);} // tgen
ccc::FF4x5y11 ::FF4x5y11(){ note_ctor("_ZN3ccc8FF4x5y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y11E, buf);
    ::ccc::FF4x5y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y11E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y11E);
    dp->::ccc::FF4x5y11::~FF4x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y11E(Test__ZN3ccc8FF4x5y11E, "_ZN3ccc8FF4x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y11C1Ev();
extern void _ZN3ccc8FF4x5y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y11E[] = {
  NSPAIR(_ZN3ccc8FF4x5y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y11E[];
extern void _ZN3ccc8FF4x5y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x5y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y11E[] = {
  {&(_ZTVN3ccc8FF4x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y11E[];
static VTBL_ENTRY alt_thunk_names1052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y11E = {  "_ZN3ccc8FF4x5y11E", // class name
  bases__ZN3ccc8FF4x5y11E, 2,
  &(vtc__ZN3ccc8FF4x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1052,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y12  : virtual ::ccc::EE4x5 {
  virtual void  abc(); // _ZN3ccc8FF4x5y123abcEv
  ~FF4x5y12(); // tgen
  FF4x5y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::FF4x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x5y123abcEv");}
ccc::FF4x5y12 ::~FF4x5y12(){ note_dtor("_ZN3ccc8FF4x5y12E", this);} // tgen
ccc::FF4x5y12 ::FF4x5y12(){ note_ctor("_ZN3ccc8FF4x5y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y12E, buf);
    ::ccc::FF4x5y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y12E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y12E);
    dp->::ccc::FF4x5y12::~FF4x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y12E(Test__ZN3ccc8FF4x5y12E, "_ZN3ccc8FF4x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y12C1Ev();
extern void _ZN3ccc8FF4x5y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y12E[] = {
  NSPAIR(_ZN3ccc8FF4x5y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x5y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y12E[] = {
  {&(_ZTVN3ccc8FF4x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y12E[];
static VTBL_ENTRY alt_thunk_names1053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y12E = {  "_ZN3ccc8FF4x5y12E", // class name
  bases__ZN3ccc8FF4x5y12E, 2,
  &(vtc__ZN3ccc8FF4x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1053,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y13  : virtual ::ccc::EE4x5 {
  virtual void  efg(); // _ZN3ccc8FF4x5y133efgEv
  ~FF4x5y13(); // tgen
  FF4x5y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::FF4x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x5y133efgEv");}
ccc::FF4x5y13 ::~FF4x5y13(){ note_dtor("_ZN3ccc8FF4x5y13E", this);} // tgen
ccc::FF4x5y13 ::FF4x5y13(){ note_ctor("_ZN3ccc8FF4x5y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y13E, buf);
    ::ccc::FF4x5y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y13E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y13E);
    dp->::ccc::FF4x5y13::~FF4x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y13E(Test__ZN3ccc8FF4x5y13E, "_ZN3ccc8FF4x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y13C1Ev();
extern void _ZN3ccc8FF4x5y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y13E[] = {
  NSPAIR(_ZN3ccc8FF4x5y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x5y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y13E[] = {
  {&(_ZTVN3ccc8FF4x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y13E[];
static VTBL_ENTRY alt_thunk_names1054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y13E = {  "_ZN3ccc8FF4x5y13E", // class name
  bases__ZN3ccc8FF4x5y13E, 2,
  &(vtc__ZN3ccc8FF4x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1054,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y14  : virtual ::ccc::EE4x5 {
  virtual void  pqr(); // _ZN3ccc8FF4x5y143pqrEv
  ~FF4x5y14(); // tgen
  FF4x5y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x5y143pqrEv");}
ccc::FF4x5y14 ::~FF4x5y14(){ note_dtor("_ZN3ccc8FF4x5y14E", this);} // tgen
ccc::FF4x5y14 ::FF4x5y14(){ note_ctor("_ZN3ccc8FF4x5y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y14E, buf);
    ::ccc::FF4x5y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y14E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y14E);
    dp->::ccc::FF4x5y14::~FF4x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y14E(Test__ZN3ccc8FF4x5y14E, "_ZN3ccc8FF4x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y14C1Ev();
extern void _ZN3ccc8FF4x5y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y14E[] = {
  NSPAIR(_ZN3ccc8FF4x5y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y14E[];
extern void _ZN3ccc8FF4x5y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x5y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y14E[] = {
  {&(_ZTVN3ccc8FF4x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y14E[];
static VTBL_ENTRY alt_thunk_names1055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y14E = {  "_ZN3ccc8FF4x5y14E", // class name
  bases__ZN3ccc8FF4x5y14E, 2,
  &(vtc__ZN3ccc8FF4x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1055,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x5y15  : virtual ::ccc::EE4x5 {
  ~FF4x5y15(); // tgen
  FF4x5y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x5y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2 v3}}
}
namespace ccc { 
ccc::FF4x5y15 ::~FF4x5y15(){ note_dtor("_ZN3ccc8FF4x5y15E", this);} // tgen
ccc::FF4x5y15 ::FF4x5y15(){ note_ctor("_ZN3ccc8FF4x5y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x5y15E, buf);
    ::ccc::FF4x5y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x5y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y15E");
    check_base_class_offset(lv, (::ccc::EE4x5*), 0, "_ZN3ccc8FF4x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x5y15E);
    dp->::ccc::FF4x5y15::~FF4x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x5y15E(Test__ZN3ccc8FF4x5y15E, "_ZN3ccc8FF4x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x5y15C1Ev();
extern void _ZN3ccc8FF4x5y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x5y15E[] = {
  NSPAIR(_ZN3ccc8FF4x5y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x5E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x5E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x5E[];
static Base_Class bases__ZN3ccc8FF4x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x5y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x5y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv)();
extern void _ZN3ccc5EE4x53pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv)();
extern void _ZN3ccc5EE4x53abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv)();
extern void _ZN3ccc5EE4x53efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x5y15E[] = {
  {&(_ZTVN3ccc8FF4x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x5y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x5E__NS_8FF4x5y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x5y15E[];
static VTBL_ENTRY alt_thunk_names1056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x53efgEv,_ZTv0_n20_N3ccc5EE4x53efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x53abcEv,_ZTv0_n16_N3ccc5EE4x53abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x53pqrEv,_ZTv0_n12_N3ccc5EE4x53pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x53pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x5y15E = {  "_ZN3ccc8FF4x5y15E", // class name
  bases__ZN3ccc8FF4x5y15E, 2,
  &(vtc__ZN3ccc8FF4x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x5y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x5y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x5y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x5y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1056,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y0  : virtual ::ccc::EE4x6 {
  virtual void  abc(); // _ZN3ccc7FF4x6y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y03pqrEv
  ~FF4x6y0(); // tgen
  FF4x6y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y03abcEv");}
void  ccc::FF4x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y03efgEv");}
void  ccc::FF4x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y03pqrEv");}
ccc::FF4x6y0 ::~FF4x6y0(){ note_dtor("_ZN3ccc7FF4x6y0E", this);} // tgen
ccc::FF4x6y0 ::FF4x6y0(){ note_ctor("_ZN3ccc7FF4x6y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y0E, buf);
    ::ccc::FF4x6y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y0E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y0E);
    dp->::ccc::FF4x6y0::~FF4x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y0E(Test__ZN3ccc7FF4x6y0E, "_ZN3ccc7FF4x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y0C1Ev();
extern void _ZN3ccc7FF4x6y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y0E[] = {
  NSPAIR(_ZN3ccc7FF4x6y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y0E[];
extern void _ZN3ccc7FF4x6y03pqrEv();
extern void _ZN3ccc7FF4x6y03abcEv();
extern void _ZN3ccc7FF4x6y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y0E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y0E[] = {
  {&(_ZTVN3ccc7FF4x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y0E[];
static VTBL_ENTRY alt_thunk_names1057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y0E = {  "_ZN3ccc7FF4x6y0E", // class name
  bases__ZN3ccc7FF4x6y0E, 2,
  &(vtc__ZN3ccc7FF4x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1057,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y1  : virtual ::ccc::EE4x6 {
  virtual void  abc(); // _ZN3ccc7FF4x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x6y13efgEv
  ~FF4x6y1(); // tgen
  FF4x6y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y13abcEv");}
void  ccc::FF4x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y13pqrEv");}
void  ccc::FF4x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y13efgEv");}
ccc::FF4x6y1 ::~FF4x6y1(){ note_dtor("_ZN3ccc7FF4x6y1E", this);} // tgen
ccc::FF4x6y1 ::FF4x6y1(){ note_ctor("_ZN3ccc7FF4x6y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y1E, buf);
    ::ccc::FF4x6y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y1E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y1E);
    dp->::ccc::FF4x6y1::~FF4x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y1E(Test__ZN3ccc7FF4x6y1E, "_ZN3ccc7FF4x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y1C1Ev();
extern void _ZN3ccc7FF4x6y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y1E[] = {
  NSPAIR(_ZN3ccc7FF4x6y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y1E[];
extern void _ZN3ccc7FF4x6y13pqrEv();
extern void _ZN3ccc7FF4x6y13abcEv();
extern void _ZN3ccc7FF4x6y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y1E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y1E[] = {
  {&(_ZTVN3ccc7FF4x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y1E[];
static VTBL_ENTRY alt_thunk_names1058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y1E = {  "_ZN3ccc7FF4x6y1E", // class name
  bases__ZN3ccc7FF4x6y1E, 2,
  &(vtc__ZN3ccc7FF4x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1058,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y2  : virtual ::ccc::EE4x6 {
  virtual void  efg(); // _ZN3ccc7FF4x6y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y23pqrEv
  ~FF4x6y2(); // tgen
  FF4x6y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y23efgEv");}
void  ccc::FF4x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y23abcEv");}
void  ccc::FF4x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y23pqrEv");}
ccc::FF4x6y2 ::~FF4x6y2(){ note_dtor("_ZN3ccc7FF4x6y2E", this);} // tgen
ccc::FF4x6y2 ::FF4x6y2(){ note_ctor("_ZN3ccc7FF4x6y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y2E, buf);
    ::ccc::FF4x6y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y2E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y2E);
    dp->::ccc::FF4x6y2::~FF4x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y2E(Test__ZN3ccc7FF4x6y2E, "_ZN3ccc7FF4x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y2C1Ev();
extern void _ZN3ccc7FF4x6y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y2E[] = {
  NSPAIR(_ZN3ccc7FF4x6y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y2E[];
extern void _ZN3ccc7FF4x6y23pqrEv();
extern void _ZN3ccc7FF4x6y23abcEv();
extern void _ZN3ccc7FF4x6y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y2E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y2E[] = {
  {&(_ZTVN3ccc7FF4x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y2E[];
static VTBL_ENTRY alt_thunk_names1059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y2E = {  "_ZN3ccc7FF4x6y2E", // class name
  bases__ZN3ccc7FF4x6y2E, 2,
  &(vtc__ZN3ccc7FF4x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1059,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y3  : virtual ::ccc::EE4x6 {
  virtual void  efg(); // _ZN3ccc7FF4x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x6y33abcEv
  ~FF4x6y3(); // tgen
  FF4x6y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y33efgEv");}
void  ccc::FF4x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y33pqrEv");}
void  ccc::FF4x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y33abcEv");}
ccc::FF4x6y3 ::~FF4x6y3(){ note_dtor("_ZN3ccc7FF4x6y3E", this);} // tgen
ccc::FF4x6y3 ::FF4x6y3(){ note_ctor("_ZN3ccc7FF4x6y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y3E, buf);
    ::ccc::FF4x6y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y3E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y3E);
    dp->::ccc::FF4x6y3::~FF4x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y3E(Test__ZN3ccc7FF4x6y3E, "_ZN3ccc7FF4x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y3C1Ev();
extern void _ZN3ccc7FF4x6y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y3E[] = {
  NSPAIR(_ZN3ccc7FF4x6y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y3E[];
extern void _ZN3ccc7FF4x6y33pqrEv();
extern void _ZN3ccc7FF4x6y33abcEv();
extern void _ZN3ccc7FF4x6y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y3E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y3E[] = {
  {&(_ZTVN3ccc7FF4x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y3E[];
static VTBL_ENTRY alt_thunk_names1060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y3E = {  "_ZN3ccc7FF4x6y3E", // class name
  bases__ZN3ccc7FF4x6y3E, 2,
  &(vtc__ZN3ccc7FF4x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1060,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y4  : virtual ::ccc::EE4x6 {
  virtual void  pqr(); // _ZN3ccc7FF4x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x6y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x6y43efgEv
  ~FF4x6y4(); // tgen
  FF4x6y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y43pqrEv");}
void  ccc::FF4x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y43abcEv");}
void  ccc::FF4x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y43efgEv");}
ccc::FF4x6y4 ::~FF4x6y4(){ note_dtor("_ZN3ccc7FF4x6y4E", this);} // tgen
ccc::FF4x6y4 ::FF4x6y4(){ note_ctor("_ZN3ccc7FF4x6y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y4E, buf);
    ::ccc::FF4x6y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y4E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y4E);
    dp->::ccc::FF4x6y4::~FF4x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y4E(Test__ZN3ccc7FF4x6y4E, "_ZN3ccc7FF4x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y4C1Ev();
extern void _ZN3ccc7FF4x6y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y4E[] = {
  NSPAIR(_ZN3ccc7FF4x6y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y4E[];
extern void _ZN3ccc7FF4x6y43pqrEv();
extern void _ZN3ccc7FF4x6y43abcEv();
extern void _ZN3ccc7FF4x6y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y4E[] = {
  {&(_ZTVN3ccc7FF4x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y4E[];
static VTBL_ENTRY alt_thunk_names1061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y4E = {  "_ZN3ccc7FF4x6y4E", // class name
  bases__ZN3ccc7FF4x6y4E, 2,
  &(vtc__ZN3ccc7FF4x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1061,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y5  : virtual ::ccc::EE4x6 {
  virtual void  pqr(); // _ZN3ccc7FF4x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x6y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x6y53abcEv
  ~FF4x6y5(); // tgen
  FF4x6y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y53pqrEv");}
void  ccc::FF4x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y53efgEv");}
void  ccc::FF4x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y53abcEv");}
ccc::FF4x6y5 ::~FF4x6y5(){ note_dtor("_ZN3ccc7FF4x6y5E", this);} // tgen
ccc::FF4x6y5 ::FF4x6y5(){ note_ctor("_ZN3ccc7FF4x6y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y5E, buf);
    ::ccc::FF4x6y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y5E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y5E);
    dp->::ccc::FF4x6y5::~FF4x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y5E(Test__ZN3ccc7FF4x6y5E, "_ZN3ccc7FF4x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y5C1Ev();
extern void _ZN3ccc7FF4x6y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y5E[] = {
  NSPAIR(_ZN3ccc7FF4x6y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y5E[];
extern void _ZN3ccc7FF4x6y53pqrEv();
extern void _ZN3ccc7FF4x6y53abcEv();
extern void _ZN3ccc7FF4x6y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y5E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y5E[] = {
  {&(_ZTVN3ccc7FF4x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y5E[];
static VTBL_ENTRY alt_thunk_names1062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y5E = {  "_ZN3ccc7FF4x6y5E", // class name
  bases__ZN3ccc7FF4x6y5E, 2,
  &(vtc__ZN3ccc7FF4x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1062,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y6  : virtual ::ccc::EE4x6 {
  virtual void  abc(); // _ZN3ccc7FF4x6y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x6y63efgEv
  ~FF4x6y6(); // tgen
  FF4x6y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y63abcEv");}
void  ccc::FF4x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y63efgEv");}
ccc::FF4x6y6 ::~FF4x6y6(){ note_dtor("_ZN3ccc7FF4x6y6E", this);} // tgen
ccc::FF4x6y6 ::FF4x6y6(){ note_ctor("_ZN3ccc7FF4x6y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y6E, buf);
    ::ccc::FF4x6y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y6E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y6E);
    dp->::ccc::FF4x6y6::~FF4x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y6E(Test__ZN3ccc7FF4x6y6E, "_ZN3ccc7FF4x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y6C1Ev();
extern void _ZN3ccc7FF4x6y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y6E[] = {
  NSPAIR(_ZN3ccc7FF4x6y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7FF4x6y63abcEv();
extern void _ZN3ccc7FF4x6y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y6E[] = {
  {&(_ZTVN3ccc7FF4x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y6E[];
static VTBL_ENTRY alt_thunk_names1063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y6E = {  "_ZN3ccc7FF4x6y6E", // class name
  bases__ZN3ccc7FF4x6y6E, 2,
  &(vtc__ZN3ccc7FF4x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1063,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y7  : virtual ::ccc::EE4x6 {
  virtual void  abc(); // _ZN3ccc7FF4x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y73pqrEv
  ~FF4x6y7(); // tgen
  FF4x6y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y73abcEv");}
void  ccc::FF4x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y73pqrEv");}
ccc::FF4x6y7 ::~FF4x6y7(){ note_dtor("_ZN3ccc7FF4x6y7E", this);} // tgen
ccc::FF4x6y7 ::FF4x6y7(){ note_ctor("_ZN3ccc7FF4x6y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y7E, buf);
    ::ccc::FF4x6y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y7E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y7E);
    dp->::ccc::FF4x6y7::~FF4x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y7E(Test__ZN3ccc7FF4x6y7E, "_ZN3ccc7FF4x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y7C1Ev();
extern void _ZN3ccc7FF4x6y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y7E[] = {
  NSPAIR(_ZN3ccc7FF4x6y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y7E[];
extern void _ZN3ccc7FF4x6y73pqrEv();
extern void _ZN3ccc7FF4x6y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y7E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y7E[] = {
  {&(_ZTVN3ccc7FF4x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y7E[];
static VTBL_ENTRY alt_thunk_names1064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y7E = {  "_ZN3ccc7FF4x6y7E", // class name
  bases__ZN3ccc7FF4x6y7E, 2,
  &(vtc__ZN3ccc7FF4x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1064,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y8  : virtual ::ccc::EE4x6 {
  virtual void  efg(); // _ZN3ccc7FF4x6y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x6y83abcEv
  ~FF4x6y8(); // tgen
  FF4x6y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y83efgEv");}
void  ccc::FF4x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x6y83abcEv");}
ccc::FF4x6y8 ::~FF4x6y8(){ note_dtor("_ZN3ccc7FF4x6y8E", this);} // tgen
ccc::FF4x6y8 ::FF4x6y8(){ note_ctor("_ZN3ccc7FF4x6y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y8E, buf);
    ::ccc::FF4x6y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y8E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y8E);
    dp->::ccc::FF4x6y8::~FF4x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y8E(Test__ZN3ccc7FF4x6y8E, "_ZN3ccc7FF4x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y8C1Ev();
extern void _ZN3ccc7FF4x6y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y8E[] = {
  NSPAIR(_ZN3ccc7FF4x6y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7FF4x6y83abcEv();
extern void _ZN3ccc7FF4x6y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y8E[] = {
  {&(_ZTVN3ccc7FF4x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y8E[];
static VTBL_ENTRY alt_thunk_names1065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y8E = {  "_ZN3ccc7FF4x6y8E", // class name
  bases__ZN3ccc7FF4x6y8E, 2,
  &(vtc__ZN3ccc7FF4x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1065,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y9  : virtual ::ccc::EE4x6 {
  virtual void  efg(); // _ZN3ccc7FF4x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x6y93pqrEv
  ~FF4x6y9(); // tgen
  FF4x6y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x6y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x6y93efgEv");}
void  ccc::FF4x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x6y93pqrEv");}
ccc::FF4x6y9 ::~FF4x6y9(){ note_dtor("_ZN3ccc7FF4x6y9E", this);} // tgen
ccc::FF4x6y9 ::FF4x6y9(){ note_ctor("_ZN3ccc7FF4x6y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x6y9E, buf);
    ::ccc::FF4x6y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x6y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y9E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc7FF4x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x6y9E);
    dp->::ccc::FF4x6y9::~FF4x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x6y9E(Test__ZN3ccc7FF4x6y9E, "_ZN3ccc7FF4x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x6y9C1Ev();
extern void _ZN3ccc7FF4x6y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x6y9E[] = {
  NSPAIR(_ZN3ccc7FF4x6y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc7FF4x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y9E[];
extern void _ZN3ccc7FF4x6y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x6y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x6y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x6y9E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x6y9E[] = {
  {&(_ZTVN3ccc7FF4x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x6y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_7FF4x6y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x6y9E[];
static VTBL_ENTRY alt_thunk_names1066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x6y9E = {  "_ZN3ccc7FF4x6y9E", // class name
  bases__ZN3ccc7FF4x6y9E, 2,
  &(vtc__ZN3ccc7FF4x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x6y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x6y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x6y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x6y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1066,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y10  : virtual ::ccc::EE4x6 {
  virtual void  pqr(); // _ZN3ccc8FF4x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x6y103abcEv
  ~FF4x6y10(); // tgen
  FF4x6y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x6y103pqrEv");}
void  ccc::FF4x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x6y103abcEv");}
ccc::FF4x6y10 ::~FF4x6y10(){ note_dtor("_ZN3ccc8FF4x6y10E", this);} // tgen
ccc::FF4x6y10 ::FF4x6y10(){ note_ctor("_ZN3ccc8FF4x6y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y10E, buf);
    ::ccc::FF4x6y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y10E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y10E);
    dp->::ccc::FF4x6y10::~FF4x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y10E(Test__ZN3ccc8FF4x6y10E, "_ZN3ccc8FF4x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y10C1Ev();
extern void _ZN3ccc8FF4x6y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y10E[] = {
  NSPAIR(_ZN3ccc8FF4x6y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y10E[];
extern void _ZN3ccc8FF4x6y103pqrEv();
extern void _ZN3ccc8FF4x6y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y10E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y10E[] = {
  {&(_ZTVN3ccc8FF4x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y10E[];
static VTBL_ENTRY alt_thunk_names1067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y10E = {  "_ZN3ccc8FF4x6y10E", // class name
  bases__ZN3ccc8FF4x6y10E, 2,
  &(vtc__ZN3ccc8FF4x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1067,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y11  : virtual ::ccc::EE4x6 {
  virtual void  pqr(); // _ZN3ccc8FF4x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x6y113efgEv
  ~FF4x6y11(); // tgen
  FF4x6y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x6y113pqrEv");}
void  ccc::FF4x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x6y113efgEv");}
ccc::FF4x6y11 ::~FF4x6y11(){ note_dtor("_ZN3ccc8FF4x6y11E", this);} // tgen
ccc::FF4x6y11 ::FF4x6y11(){ note_ctor("_ZN3ccc8FF4x6y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y11E, buf);
    ::ccc::FF4x6y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y11E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y11E);
    dp->::ccc::FF4x6y11::~FF4x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y11E(Test__ZN3ccc8FF4x6y11E, "_ZN3ccc8FF4x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y11C1Ev();
extern void _ZN3ccc8FF4x6y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y11E[] = {
  NSPAIR(_ZN3ccc8FF4x6y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y11E[];
extern void _ZN3ccc8FF4x6y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x6y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y11E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y11E[] = {
  {&(_ZTVN3ccc8FF4x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y11E[];
static VTBL_ENTRY alt_thunk_names1068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y11E = {  "_ZN3ccc8FF4x6y11E", // class name
  bases__ZN3ccc8FF4x6y11E, 2,
  &(vtc__ZN3ccc8FF4x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1068,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y12  : virtual ::ccc::EE4x6 {
  virtual void  abc(); // _ZN3ccc8FF4x6y123abcEv
  ~FF4x6y12(); // tgen
  FF4x6y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x6y123abcEv");}
ccc::FF4x6y12 ::~FF4x6y12(){ note_dtor("_ZN3ccc8FF4x6y12E", this);} // tgen
ccc::FF4x6y12 ::FF4x6y12(){ note_ctor("_ZN3ccc8FF4x6y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y12E, buf);
    ::ccc::FF4x6y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y12E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y12E);
    dp->::ccc::FF4x6y12::~FF4x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y12E(Test__ZN3ccc8FF4x6y12E, "_ZN3ccc8FF4x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y12C1Ev();
extern void _ZN3ccc8FF4x6y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y12E[] = {
  NSPAIR(_ZN3ccc8FF4x6y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x6y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y12E[] = {
  {&(_ZTVN3ccc8FF4x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y12E[];
static VTBL_ENTRY alt_thunk_names1069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y12E = {  "_ZN3ccc8FF4x6y12E", // class name
  bases__ZN3ccc8FF4x6y12E, 2,
  &(vtc__ZN3ccc8FF4x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1069,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y13  : virtual ::ccc::EE4x6 {
  virtual void  efg(); // _ZN3ccc8FF4x6y133efgEv
  ~FF4x6y13(); // tgen
  FF4x6y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x6y133efgEv");}
ccc::FF4x6y13 ::~FF4x6y13(){ note_dtor("_ZN3ccc8FF4x6y13E", this);} // tgen
ccc::FF4x6y13 ::FF4x6y13(){ note_ctor("_ZN3ccc8FF4x6y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y13E, buf);
    ::ccc::FF4x6y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y13E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y13E);
    dp->::ccc::FF4x6y13::~FF4x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y13E(Test__ZN3ccc8FF4x6y13E, "_ZN3ccc8FF4x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y13C1Ev();
extern void _ZN3ccc8FF4x6y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y13E[] = {
  NSPAIR(_ZN3ccc8FF4x6y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x6y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y13E[] = {
  {&(_ZTVN3ccc8FF4x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y13E[];
static VTBL_ENTRY alt_thunk_names1070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y13E = {  "_ZN3ccc8FF4x6y13E", // class name
  bases__ZN3ccc8FF4x6y13E, 2,
  &(vtc__ZN3ccc8FF4x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1070,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y14  : virtual ::ccc::EE4x6 {
  virtual void  pqr(); // _ZN3ccc8FF4x6y143pqrEv
  ~FF4x6y14(); // tgen
  FF4x6y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x6y143pqrEv");}
ccc::FF4x6y14 ::~FF4x6y14(){ note_dtor("_ZN3ccc8FF4x6y14E", this);} // tgen
ccc::FF4x6y14 ::FF4x6y14(){ note_ctor("_ZN3ccc8FF4x6y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y14E, buf);
    ::ccc::FF4x6y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y14E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y14E);
    dp->::ccc::FF4x6y14::~FF4x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y14E(Test__ZN3ccc8FF4x6y14E, "_ZN3ccc8FF4x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y14C1Ev();
extern void _ZN3ccc8FF4x6y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y14E[] = {
  NSPAIR(_ZN3ccc8FF4x6y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y14E[];
extern void _ZN3ccc8FF4x6y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x6y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y14E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y14E[] = {
  {&(_ZTVN3ccc8FF4x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y14E[];
static VTBL_ENTRY alt_thunk_names1071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y14E = {  "_ZN3ccc8FF4x6y14E", // class name
  bases__ZN3ccc8FF4x6y14E, 2,
  &(vtc__ZN3ccc8FF4x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1071,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x6y15  : virtual ::ccc::EE4x6 {
  ~FF4x6y15(); // tgen
  FF4x6y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x6y15E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v2}}
}
namespace ccc { 
ccc::FF4x6y15 ::~FF4x6y15(){ note_dtor("_ZN3ccc8FF4x6y15E", this);} // tgen
ccc::FF4x6y15 ::FF4x6y15(){ note_ctor("_ZN3ccc8FF4x6y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x6y15E, buf);
    ::ccc::FF4x6y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x6y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y15E");
    check_base_class_offset(lv, (::ccc::EE4x6*), 0, "_ZN3ccc8FF4x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x6y15E);
    dp->::ccc::FF4x6y15::~FF4x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x6y15E(Test__ZN3ccc8FF4x6y15E, "_ZN3ccc8FF4x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x6y15C1Ev();
extern void _ZN3ccc8FF4x6y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x6y15E[] = {
  NSPAIR(_ZN3ccc8FF4x6y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x6E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x6E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x6E[];
static Base_Class bases__ZN3ccc8FF4x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x6y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv)();
extern void _ZN3ccc5EE4x63abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv)();
extern void _ZN3ccc5EE4x63efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x6y15E[] = {
  {&(_ZTVN3ccc8FF4x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x6y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x6E__NS_8FF4x6y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x6y15E[];
static VTBL_ENTRY alt_thunk_names1072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x63efgEv,_ZTv0_n20_N3ccc5EE4x63efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x63abcEv,_ZTv0_n16_N3ccc5EE4x63abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x63abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x6y15E = {  "_ZN3ccc8FF4x6y15E", // class name
  bases__ZN3ccc8FF4x6y15E, 2,
  &(vtc__ZN3ccc8FF4x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x6y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x6y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x6y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x6y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1072,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y0  : virtual ::ccc::EE4x7 {
  virtual void  abc(); // _ZN3ccc7FF4x7y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y03pqrEv
  ~FF4x7y0(); // tgen
  FF4x7y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y03abcEv");}
void  ccc::FF4x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y03efgEv");}
void  ccc::FF4x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y03pqrEv");}
ccc::FF4x7y0 ::~FF4x7y0(){ note_dtor("_ZN3ccc7FF4x7y0E", this);} // tgen
ccc::FF4x7y0 ::FF4x7y0(){ note_ctor("_ZN3ccc7FF4x7y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y0E, buf);
    ::ccc::FF4x7y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y0E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y0E);
    dp->::ccc::FF4x7y0::~FF4x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y0E(Test__ZN3ccc7FF4x7y0E, "_ZN3ccc7FF4x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y0C1Ev();
extern void _ZN3ccc7FF4x7y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y0E[] = {
  NSPAIR(_ZN3ccc7FF4x7y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y0E[];
extern void _ZN3ccc7FF4x7y03pqrEv();
extern void _ZN3ccc7FF4x7y03abcEv();
extern void _ZN3ccc7FF4x7y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y0E[] = {
  {&(_ZTVN3ccc7FF4x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y0E[];
static VTBL_ENTRY alt_thunk_names1073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y0E = {  "_ZN3ccc7FF4x7y0E", // class name
  bases__ZN3ccc7FF4x7y0E, 2,
  &(vtc__ZN3ccc7FF4x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1073,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y1  : virtual ::ccc::EE4x7 {
  virtual void  abc(); // _ZN3ccc7FF4x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x7y13efgEv
  ~FF4x7y1(); // tgen
  FF4x7y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y13abcEv");}
void  ccc::FF4x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y13pqrEv");}
void  ccc::FF4x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y13efgEv");}
ccc::FF4x7y1 ::~FF4x7y1(){ note_dtor("_ZN3ccc7FF4x7y1E", this);} // tgen
ccc::FF4x7y1 ::FF4x7y1(){ note_ctor("_ZN3ccc7FF4x7y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y1E, buf);
    ::ccc::FF4x7y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y1E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y1E);
    dp->::ccc::FF4x7y1::~FF4x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y1E(Test__ZN3ccc7FF4x7y1E, "_ZN3ccc7FF4x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y1C1Ev();
extern void _ZN3ccc7FF4x7y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y1E[] = {
  NSPAIR(_ZN3ccc7FF4x7y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y1E[];
extern void _ZN3ccc7FF4x7y13pqrEv();
extern void _ZN3ccc7FF4x7y13abcEv();
extern void _ZN3ccc7FF4x7y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y1E[] = {
  {&(_ZTVN3ccc7FF4x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y1E[];
static VTBL_ENTRY alt_thunk_names1074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y1E = {  "_ZN3ccc7FF4x7y1E", // class name
  bases__ZN3ccc7FF4x7y1E, 2,
  &(vtc__ZN3ccc7FF4x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1074,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y2  : virtual ::ccc::EE4x7 {
  virtual void  efg(); // _ZN3ccc7FF4x7y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y23pqrEv
  ~FF4x7y2(); // tgen
  FF4x7y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y23efgEv");}
void  ccc::FF4x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y23abcEv");}
void  ccc::FF4x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y23pqrEv");}
ccc::FF4x7y2 ::~FF4x7y2(){ note_dtor("_ZN3ccc7FF4x7y2E", this);} // tgen
ccc::FF4x7y2 ::FF4x7y2(){ note_ctor("_ZN3ccc7FF4x7y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y2E, buf);
    ::ccc::FF4x7y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y2E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y2E);
    dp->::ccc::FF4x7y2::~FF4x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y2E(Test__ZN3ccc7FF4x7y2E, "_ZN3ccc7FF4x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y2C1Ev();
extern void _ZN3ccc7FF4x7y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y2E[] = {
  NSPAIR(_ZN3ccc7FF4x7y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y2E[];
extern void _ZN3ccc7FF4x7y23pqrEv();
extern void _ZN3ccc7FF4x7y23abcEv();
extern void _ZN3ccc7FF4x7y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y2E[] = {
  {&(_ZTVN3ccc7FF4x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y2E[];
static VTBL_ENTRY alt_thunk_names1075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y2E = {  "_ZN3ccc7FF4x7y2E", // class name
  bases__ZN3ccc7FF4x7y2E, 2,
  &(vtc__ZN3ccc7FF4x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1075,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y3  : virtual ::ccc::EE4x7 {
  virtual void  efg(); // _ZN3ccc7FF4x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x7y33abcEv
  ~FF4x7y3(); // tgen
  FF4x7y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y33efgEv");}
void  ccc::FF4x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y33pqrEv");}
void  ccc::FF4x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y33abcEv");}
ccc::FF4x7y3 ::~FF4x7y3(){ note_dtor("_ZN3ccc7FF4x7y3E", this);} // tgen
ccc::FF4x7y3 ::FF4x7y3(){ note_ctor("_ZN3ccc7FF4x7y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y3E, buf);
    ::ccc::FF4x7y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y3E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y3E);
    dp->::ccc::FF4x7y3::~FF4x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y3E(Test__ZN3ccc7FF4x7y3E, "_ZN3ccc7FF4x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y3C1Ev();
extern void _ZN3ccc7FF4x7y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y3E[] = {
  NSPAIR(_ZN3ccc7FF4x7y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y3E[];
extern void _ZN3ccc7FF4x7y33pqrEv();
extern void _ZN3ccc7FF4x7y33abcEv();
extern void _ZN3ccc7FF4x7y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y3E[] = {
  {&(_ZTVN3ccc7FF4x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y3E[];
static VTBL_ENTRY alt_thunk_names1076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y3E = {  "_ZN3ccc7FF4x7y3E", // class name
  bases__ZN3ccc7FF4x7y3E, 2,
  &(vtc__ZN3ccc7FF4x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1076,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y4  : virtual ::ccc::EE4x7 {
  virtual void  pqr(); // _ZN3ccc7FF4x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x7y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x7y43efgEv
  ~FF4x7y4(); // tgen
  FF4x7y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y43pqrEv");}
void  ccc::FF4x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y43abcEv");}
void  ccc::FF4x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y43efgEv");}
ccc::FF4x7y4 ::~FF4x7y4(){ note_dtor("_ZN3ccc7FF4x7y4E", this);} // tgen
ccc::FF4x7y4 ::FF4x7y4(){ note_ctor("_ZN3ccc7FF4x7y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y4E, buf);
    ::ccc::FF4x7y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y4E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y4E);
    dp->::ccc::FF4x7y4::~FF4x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y4E(Test__ZN3ccc7FF4x7y4E, "_ZN3ccc7FF4x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y4C1Ev();
extern void _ZN3ccc7FF4x7y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y4E[] = {
  NSPAIR(_ZN3ccc7FF4x7y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y4E[];
extern void _ZN3ccc7FF4x7y43pqrEv();
extern void _ZN3ccc7FF4x7y43abcEv();
extern void _ZN3ccc7FF4x7y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y4E[] = {
  {&(_ZTVN3ccc7FF4x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y4E[];
static VTBL_ENTRY alt_thunk_names1077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y4E = {  "_ZN3ccc7FF4x7y4E", // class name
  bases__ZN3ccc7FF4x7y4E, 2,
  &(vtc__ZN3ccc7FF4x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1077,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y5  : virtual ::ccc::EE4x7 {
  virtual void  pqr(); // _ZN3ccc7FF4x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x7y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x7y53abcEv
  ~FF4x7y5(); // tgen
  FF4x7y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y53pqrEv");}
void  ccc::FF4x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y53efgEv");}
void  ccc::FF4x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y53abcEv");}
ccc::FF4x7y5 ::~FF4x7y5(){ note_dtor("_ZN3ccc7FF4x7y5E", this);} // tgen
ccc::FF4x7y5 ::FF4x7y5(){ note_ctor("_ZN3ccc7FF4x7y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y5E, buf);
    ::ccc::FF4x7y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y5E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y5E);
    dp->::ccc::FF4x7y5::~FF4x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y5E(Test__ZN3ccc7FF4x7y5E, "_ZN3ccc7FF4x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y5C1Ev();
extern void _ZN3ccc7FF4x7y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y5E[] = {
  NSPAIR(_ZN3ccc7FF4x7y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y5E[];
extern void _ZN3ccc7FF4x7y53pqrEv();
extern void _ZN3ccc7FF4x7y53abcEv();
extern void _ZN3ccc7FF4x7y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y5E[] = {
  {&(_ZTVN3ccc7FF4x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y5E[];
static VTBL_ENTRY alt_thunk_names1078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y5E = {  "_ZN3ccc7FF4x7y5E", // class name
  bases__ZN3ccc7FF4x7y5E, 2,
  &(vtc__ZN3ccc7FF4x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1078,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y6  : virtual ::ccc::EE4x7 {
  virtual void  abc(); // _ZN3ccc7FF4x7y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x7y63efgEv
  ~FF4x7y6(); // tgen
  FF4x7y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y63abcEv");}
void  ccc::FF4x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y63efgEv");}
ccc::FF4x7y6 ::~FF4x7y6(){ note_dtor("_ZN3ccc7FF4x7y6E", this);} // tgen
ccc::FF4x7y6 ::FF4x7y6(){ note_ctor("_ZN3ccc7FF4x7y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y6E, buf);
    ::ccc::FF4x7y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y6E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y6E);
    dp->::ccc::FF4x7y6::~FF4x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y6E(Test__ZN3ccc7FF4x7y6E, "_ZN3ccc7FF4x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y6C1Ev();
extern void _ZN3ccc7FF4x7y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y6E[] = {
  NSPAIR(_ZN3ccc7FF4x7y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x7y63abcEv();
extern void _ZN3ccc7FF4x7y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y6E[] = {
  {&(_ZTVN3ccc7FF4x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y6E[];
static VTBL_ENTRY alt_thunk_names1079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y6E = {  "_ZN3ccc7FF4x7y6E", // class name
  bases__ZN3ccc7FF4x7y6E, 2,
  &(vtc__ZN3ccc7FF4x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1079,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y7  : virtual ::ccc::EE4x7 {
  virtual void  abc(); // _ZN3ccc7FF4x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y73pqrEv
  ~FF4x7y7(); // tgen
  FF4x7y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y73abcEv");}
void  ccc::FF4x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y73pqrEv");}
ccc::FF4x7y7 ::~FF4x7y7(){ note_dtor("_ZN3ccc7FF4x7y7E", this);} // tgen
ccc::FF4x7y7 ::FF4x7y7(){ note_ctor("_ZN3ccc7FF4x7y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y7E, buf);
    ::ccc::FF4x7y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y7E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y7E);
    dp->::ccc::FF4x7y7::~FF4x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y7E(Test__ZN3ccc7FF4x7y7E, "_ZN3ccc7FF4x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y7C1Ev();
extern void _ZN3ccc7FF4x7y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y7E[] = {
  NSPAIR(_ZN3ccc7FF4x7y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y7E[];
extern void _ZN3ccc7FF4x7y73pqrEv();
extern void _ZN3ccc7FF4x7y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y7E[] = {
  {&(_ZTVN3ccc7FF4x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y7E[];
static VTBL_ENTRY alt_thunk_names1080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y7E = {  "_ZN3ccc7FF4x7y7E", // class name
  bases__ZN3ccc7FF4x7y7E, 2,
  &(vtc__ZN3ccc7FF4x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1080,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y8  : virtual ::ccc::EE4x7 {
  virtual void  efg(); // _ZN3ccc7FF4x7y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x7y83abcEv
  ~FF4x7y8(); // tgen
  FF4x7y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y83efgEv");}
void  ccc::FF4x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x7y83abcEv");}
ccc::FF4x7y8 ::~FF4x7y8(){ note_dtor("_ZN3ccc7FF4x7y8E", this);} // tgen
ccc::FF4x7y8 ::FF4x7y8(){ note_ctor("_ZN3ccc7FF4x7y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y8E, buf);
    ::ccc::FF4x7y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y8E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y8E);
    dp->::ccc::FF4x7y8::~FF4x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y8E(Test__ZN3ccc7FF4x7y8E, "_ZN3ccc7FF4x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y8C1Ev();
extern void _ZN3ccc7FF4x7y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y8E[] = {
  NSPAIR(_ZN3ccc7FF4x7y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x7y83abcEv();
extern void _ZN3ccc7FF4x7y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y8E[] = {
  {&(_ZTVN3ccc7FF4x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y8E[];
static VTBL_ENTRY alt_thunk_names1081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y8E = {  "_ZN3ccc7FF4x7y8E", // class name
  bases__ZN3ccc7FF4x7y8E, 2,
  &(vtc__ZN3ccc7FF4x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1081,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y9  : virtual ::ccc::EE4x7 {
  virtual void  efg(); // _ZN3ccc7FF4x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x7y93pqrEv
  ~FF4x7y9(); // tgen
  FF4x7y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x7y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x7y93efgEv");}
void  ccc::FF4x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x7y93pqrEv");}
ccc::FF4x7y9 ::~FF4x7y9(){ note_dtor("_ZN3ccc7FF4x7y9E", this);} // tgen
ccc::FF4x7y9 ::FF4x7y9(){ note_ctor("_ZN3ccc7FF4x7y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x7y9E, buf);
    ::ccc::FF4x7y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x7y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y9E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc7FF4x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x7y9E);
    dp->::ccc::FF4x7y9::~FF4x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x7y9E(Test__ZN3ccc7FF4x7y9E, "_ZN3ccc7FF4x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x7y9C1Ev();
extern void _ZN3ccc7FF4x7y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x7y9E[] = {
  NSPAIR(_ZN3ccc7FF4x7y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc7FF4x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y9E[];
extern void _ZN3ccc7FF4x7y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x7y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x7y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x7y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x7y9E[] = {
  {&(_ZTVN3ccc7FF4x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x7y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_7FF4x7y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x7y9E[];
static VTBL_ENTRY alt_thunk_names1082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x7y9E = {  "_ZN3ccc7FF4x7y9E", // class name
  bases__ZN3ccc7FF4x7y9E, 2,
  &(vtc__ZN3ccc7FF4x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x7y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x7y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x7y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x7y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1082,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y10  : virtual ::ccc::EE4x7 {
  virtual void  pqr(); // _ZN3ccc8FF4x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x7y103abcEv
  ~FF4x7y10(); // tgen
  FF4x7y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x7y103pqrEv");}
void  ccc::FF4x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x7y103abcEv");}
ccc::FF4x7y10 ::~FF4x7y10(){ note_dtor("_ZN3ccc8FF4x7y10E", this);} // tgen
ccc::FF4x7y10 ::FF4x7y10(){ note_ctor("_ZN3ccc8FF4x7y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y10E, buf);
    ::ccc::FF4x7y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y10E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y10E);
    dp->::ccc::FF4x7y10::~FF4x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y10E(Test__ZN3ccc8FF4x7y10E, "_ZN3ccc8FF4x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y10C1Ev();
extern void _ZN3ccc8FF4x7y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y10E[] = {
  NSPAIR(_ZN3ccc8FF4x7y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y10E[];
extern void _ZN3ccc8FF4x7y103pqrEv();
extern void _ZN3ccc8FF4x7y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y10E[] = {
  {&(_ZTVN3ccc8FF4x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y10E[];
static VTBL_ENTRY alt_thunk_names1083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y10E = {  "_ZN3ccc8FF4x7y10E", // class name
  bases__ZN3ccc8FF4x7y10E, 2,
  &(vtc__ZN3ccc8FF4x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1083,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y11  : virtual ::ccc::EE4x7 {
  virtual void  pqr(); // _ZN3ccc8FF4x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x7y113efgEv
  ~FF4x7y11(); // tgen
  FF4x7y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x7y113pqrEv");}
void  ccc::FF4x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x7y113efgEv");}
ccc::FF4x7y11 ::~FF4x7y11(){ note_dtor("_ZN3ccc8FF4x7y11E", this);} // tgen
ccc::FF4x7y11 ::FF4x7y11(){ note_ctor("_ZN3ccc8FF4x7y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y11E, buf);
    ::ccc::FF4x7y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y11E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y11E);
    dp->::ccc::FF4x7y11::~FF4x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y11E(Test__ZN3ccc8FF4x7y11E, "_ZN3ccc8FF4x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y11C1Ev();
extern void _ZN3ccc8FF4x7y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y11E[] = {
  NSPAIR(_ZN3ccc8FF4x7y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y11E[];
extern void _ZN3ccc8FF4x7y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x7y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y11E[] = {
  {&(_ZTVN3ccc8FF4x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y11E[];
static VTBL_ENTRY alt_thunk_names1084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y11E = {  "_ZN3ccc8FF4x7y11E", // class name
  bases__ZN3ccc8FF4x7y11E, 2,
  &(vtc__ZN3ccc8FF4x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1084,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y12  : virtual ::ccc::EE4x7 {
  virtual void  abc(); // _ZN3ccc8FF4x7y123abcEv
  ~FF4x7y12(); // tgen
  FF4x7y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x7y123abcEv");}
ccc::FF4x7y12 ::~FF4x7y12(){ note_dtor("_ZN3ccc8FF4x7y12E", this);} // tgen
ccc::FF4x7y12 ::FF4x7y12(){ note_ctor("_ZN3ccc8FF4x7y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y12E, buf);
    ::ccc::FF4x7y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y12E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y12E);
    dp->::ccc::FF4x7y12::~FF4x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y12E(Test__ZN3ccc8FF4x7y12E, "_ZN3ccc8FF4x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y12C1Ev();
extern void _ZN3ccc8FF4x7y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y12E[] = {
  NSPAIR(_ZN3ccc8FF4x7y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x7y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y12E[] = {
  {&(_ZTVN3ccc8FF4x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y12E[];
static VTBL_ENTRY alt_thunk_names1085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y12E = {  "_ZN3ccc8FF4x7y12E", // class name
  bases__ZN3ccc8FF4x7y12E, 2,
  &(vtc__ZN3ccc8FF4x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1085,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y13  : virtual ::ccc::EE4x7 {
  virtual void  efg(); // _ZN3ccc8FF4x7y133efgEv
  ~FF4x7y13(); // tgen
  FF4x7y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x7y133efgEv");}
ccc::FF4x7y13 ::~FF4x7y13(){ note_dtor("_ZN3ccc8FF4x7y13E", this);} // tgen
ccc::FF4x7y13 ::FF4x7y13(){ note_ctor("_ZN3ccc8FF4x7y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y13E, buf);
    ::ccc::FF4x7y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y13E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y13E);
    dp->::ccc::FF4x7y13::~FF4x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y13E(Test__ZN3ccc8FF4x7y13E, "_ZN3ccc8FF4x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y13C1Ev();
extern void _ZN3ccc8FF4x7y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y13E[] = {
  NSPAIR(_ZN3ccc8FF4x7y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x7y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y13E[] = {
  {&(_ZTVN3ccc8FF4x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y13E[];
static VTBL_ENTRY alt_thunk_names1086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y13E = {  "_ZN3ccc8FF4x7y13E", // class name
  bases__ZN3ccc8FF4x7y13E, 2,
  &(vtc__ZN3ccc8FF4x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1086,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y14  : virtual ::ccc::EE4x7 {
  virtual void  pqr(); // _ZN3ccc8FF4x7y143pqrEv
  ~FF4x7y14(); // tgen
  FF4x7y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x7y143pqrEv");}
ccc::FF4x7y14 ::~FF4x7y14(){ note_dtor("_ZN3ccc8FF4x7y14E", this);} // tgen
ccc::FF4x7y14 ::FF4x7y14(){ note_ctor("_ZN3ccc8FF4x7y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y14E, buf);
    ::ccc::FF4x7y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y14E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y14E);
    dp->::ccc::FF4x7y14::~FF4x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y14E(Test__ZN3ccc8FF4x7y14E, "_ZN3ccc8FF4x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y14C1Ev();
extern void _ZN3ccc8FF4x7y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y14E[] = {
  NSPAIR(_ZN3ccc8FF4x7y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y14E[];
extern void _ZN3ccc8FF4x7y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x7y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y14E[] = {
  {&(_ZTVN3ccc8FF4x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y14E[];
static VTBL_ENTRY alt_thunk_names1087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y14E = {  "_ZN3ccc8FF4x7y14E", // class name
  bases__ZN3ccc8FF4x7y14E, 2,
  &(vtc__ZN3ccc8FF4x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1087,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x7y15  : virtual ::ccc::EE4x7 {
  ~FF4x7y15(); // tgen
  FF4x7y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x7y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1 v2}}
}
namespace ccc { 
ccc::FF4x7y15 ::~FF4x7y15(){ note_dtor("_ZN3ccc8FF4x7y15E", this);} // tgen
ccc::FF4x7y15 ::FF4x7y15(){ note_ctor("_ZN3ccc8FF4x7y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x7y15E, buf);
    ::ccc::FF4x7y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x7y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y15E");
    check_base_class_offset(lv, (::ccc::EE4x7*), 0, "_ZN3ccc8FF4x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x7y15E);
    dp->::ccc::FF4x7y15::~FF4x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x7y15E(Test__ZN3ccc8FF4x7y15E, "_ZN3ccc8FF4x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x7y15C1Ev();
extern void _ZN3ccc8FF4x7y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x7y15E[] = {
  NSPAIR(_ZN3ccc8FF4x7y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x7E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x7E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x7E[];
static Base_Class bases__ZN3ccc8FF4x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x7y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x7y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv)();
extern void _ZN3ccc5EE4x73pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv)();
extern void _ZN3ccc5EE4x73abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x7y15E[] = {
  {&(_ZTVN3ccc8FF4x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x7y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x7E__NS_8FF4x7y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x7y15E[];
static VTBL_ENTRY alt_thunk_names1088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x73abcEv,_ZTv0_n16_N3ccc5EE4x73abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x73pqrEv,_ZTv0_n12_N3ccc5EE4x73pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x73pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x7y15E = {  "_ZN3ccc8FF4x7y15E", // class name
  bases__ZN3ccc8FF4x7y15E, 2,
  &(vtc__ZN3ccc8FF4x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x7y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x7y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x7y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x7y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1088,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y0  : virtual ::ccc::EE4x8 {
  virtual void  abc(); // _ZN3ccc7FF4x8y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y03pqrEv
  ~FF4x8y0(); // tgen
  FF4x8y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y03abcEv");}
void  ccc::FF4x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y03efgEv");}
void  ccc::FF4x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y03pqrEv");}
ccc::FF4x8y0 ::~FF4x8y0(){ note_dtor("_ZN3ccc7FF4x8y0E", this);} // tgen
ccc::FF4x8y0 ::FF4x8y0(){ note_ctor("_ZN3ccc7FF4x8y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y0E, buf);
    ::ccc::FF4x8y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y0E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y0E);
    dp->::ccc::FF4x8y0::~FF4x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y0E(Test__ZN3ccc7FF4x8y0E, "_ZN3ccc7FF4x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y0C1Ev();
extern void _ZN3ccc7FF4x8y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y0E[] = {
  NSPAIR(_ZN3ccc7FF4x8y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y0E[];
extern void _ZN3ccc7FF4x8y03pqrEv();
extern void _ZN3ccc7FF4x8y03abcEv();
extern void _ZN3ccc7FF4x8y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y0E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y0E[] = {
  {&(_ZTVN3ccc7FF4x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y0E[];
static VTBL_ENTRY alt_thunk_names1089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y0E = {  "_ZN3ccc7FF4x8y0E", // class name
  bases__ZN3ccc7FF4x8y0E, 2,
  &(vtc__ZN3ccc7FF4x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1089,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y1  : virtual ::ccc::EE4x8 {
  virtual void  abc(); // _ZN3ccc7FF4x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x8y13efgEv
  ~FF4x8y1(); // tgen
  FF4x8y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y13abcEv");}
void  ccc::FF4x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y13pqrEv");}
void  ccc::FF4x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y13efgEv");}
ccc::FF4x8y1 ::~FF4x8y1(){ note_dtor("_ZN3ccc7FF4x8y1E", this);} // tgen
ccc::FF4x8y1 ::FF4x8y1(){ note_ctor("_ZN3ccc7FF4x8y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y1E, buf);
    ::ccc::FF4x8y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y1E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y1E);
    dp->::ccc::FF4x8y1::~FF4x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y1E(Test__ZN3ccc7FF4x8y1E, "_ZN3ccc7FF4x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y1C1Ev();
extern void _ZN3ccc7FF4x8y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y1E[] = {
  NSPAIR(_ZN3ccc7FF4x8y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y1E[];
extern void _ZN3ccc7FF4x8y13pqrEv();
extern void _ZN3ccc7FF4x8y13abcEv();
extern void _ZN3ccc7FF4x8y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y1E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y1E[] = {
  {&(_ZTVN3ccc7FF4x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y1E[];
static VTBL_ENTRY alt_thunk_names1090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y1E = {  "_ZN3ccc7FF4x8y1E", // class name
  bases__ZN3ccc7FF4x8y1E, 2,
  &(vtc__ZN3ccc7FF4x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1090,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y2  : virtual ::ccc::EE4x8 {
  virtual void  efg(); // _ZN3ccc7FF4x8y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y23pqrEv
  ~FF4x8y2(); // tgen
  FF4x8y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y23efgEv");}
void  ccc::FF4x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y23abcEv");}
void  ccc::FF4x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y23pqrEv");}
ccc::FF4x8y2 ::~FF4x8y2(){ note_dtor("_ZN3ccc7FF4x8y2E", this);} // tgen
ccc::FF4x8y2 ::FF4x8y2(){ note_ctor("_ZN3ccc7FF4x8y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y2E, buf);
    ::ccc::FF4x8y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y2E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y2E);
    dp->::ccc::FF4x8y2::~FF4x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y2E(Test__ZN3ccc7FF4x8y2E, "_ZN3ccc7FF4x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y2C1Ev();
extern void _ZN3ccc7FF4x8y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y2E[] = {
  NSPAIR(_ZN3ccc7FF4x8y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y2E[];
extern void _ZN3ccc7FF4x8y23pqrEv();
extern void _ZN3ccc7FF4x8y23abcEv();
extern void _ZN3ccc7FF4x8y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y2E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y2E[] = {
  {&(_ZTVN3ccc7FF4x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y2E[];
static VTBL_ENTRY alt_thunk_names1091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y2E = {  "_ZN3ccc7FF4x8y2E", // class name
  bases__ZN3ccc7FF4x8y2E, 2,
  &(vtc__ZN3ccc7FF4x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1091,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y3  : virtual ::ccc::EE4x8 {
  virtual void  efg(); // _ZN3ccc7FF4x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x8y33abcEv
  ~FF4x8y3(); // tgen
  FF4x8y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y33efgEv");}
void  ccc::FF4x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y33pqrEv");}
void  ccc::FF4x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y33abcEv");}
ccc::FF4x8y3 ::~FF4x8y3(){ note_dtor("_ZN3ccc7FF4x8y3E", this);} // tgen
ccc::FF4x8y3 ::FF4x8y3(){ note_ctor("_ZN3ccc7FF4x8y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y3E, buf);
    ::ccc::FF4x8y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y3E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y3E);
    dp->::ccc::FF4x8y3::~FF4x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y3E(Test__ZN3ccc7FF4x8y3E, "_ZN3ccc7FF4x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y3C1Ev();
extern void _ZN3ccc7FF4x8y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y3E[] = {
  NSPAIR(_ZN3ccc7FF4x8y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y3E[];
extern void _ZN3ccc7FF4x8y33pqrEv();
extern void _ZN3ccc7FF4x8y33abcEv();
extern void _ZN3ccc7FF4x8y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y3E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y3E[] = {
  {&(_ZTVN3ccc7FF4x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y3E[];
static VTBL_ENTRY alt_thunk_names1092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y3E = {  "_ZN3ccc7FF4x8y3E", // class name
  bases__ZN3ccc7FF4x8y3E, 2,
  &(vtc__ZN3ccc7FF4x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1092,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y4  : virtual ::ccc::EE4x8 {
  virtual void  pqr(); // _ZN3ccc7FF4x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x8y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x8y43efgEv
  ~FF4x8y4(); // tgen
  FF4x8y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y43pqrEv");}
void  ccc::FF4x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y43abcEv");}
void  ccc::FF4x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y43efgEv");}
ccc::FF4x8y4 ::~FF4x8y4(){ note_dtor("_ZN3ccc7FF4x8y4E", this);} // tgen
ccc::FF4x8y4 ::FF4x8y4(){ note_ctor("_ZN3ccc7FF4x8y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y4E, buf);
    ::ccc::FF4x8y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y4E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y4E);
    dp->::ccc::FF4x8y4::~FF4x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y4E(Test__ZN3ccc7FF4x8y4E, "_ZN3ccc7FF4x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y4C1Ev();
extern void _ZN3ccc7FF4x8y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y4E[] = {
  NSPAIR(_ZN3ccc7FF4x8y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y4E[];
extern void _ZN3ccc7FF4x8y43pqrEv();
extern void _ZN3ccc7FF4x8y43abcEv();
extern void _ZN3ccc7FF4x8y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y4E[] = {
  {&(_ZTVN3ccc7FF4x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y4E[];
static VTBL_ENTRY alt_thunk_names1093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y4E = {  "_ZN3ccc7FF4x8y4E", // class name
  bases__ZN3ccc7FF4x8y4E, 2,
  &(vtc__ZN3ccc7FF4x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1093,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y5  : virtual ::ccc::EE4x8 {
  virtual void  pqr(); // _ZN3ccc7FF4x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x8y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x8y53abcEv
  ~FF4x8y5(); // tgen
  FF4x8y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y53pqrEv");}
void  ccc::FF4x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y53efgEv");}
void  ccc::FF4x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y53abcEv");}
ccc::FF4x8y5 ::~FF4x8y5(){ note_dtor("_ZN3ccc7FF4x8y5E", this);} // tgen
ccc::FF4x8y5 ::FF4x8y5(){ note_ctor("_ZN3ccc7FF4x8y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y5E, buf);
    ::ccc::FF4x8y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y5E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y5E);
    dp->::ccc::FF4x8y5::~FF4x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y5E(Test__ZN3ccc7FF4x8y5E, "_ZN3ccc7FF4x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y5C1Ev();
extern void _ZN3ccc7FF4x8y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y5E[] = {
  NSPAIR(_ZN3ccc7FF4x8y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y5E[];
extern void _ZN3ccc7FF4x8y53pqrEv();
extern void _ZN3ccc7FF4x8y53abcEv();
extern void _ZN3ccc7FF4x8y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y5E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y5E[] = {
  {&(_ZTVN3ccc7FF4x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y5E[];
static VTBL_ENTRY alt_thunk_names1094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y5E = {  "_ZN3ccc7FF4x8y5E", // class name
  bases__ZN3ccc7FF4x8y5E, 2,
  &(vtc__ZN3ccc7FF4x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1094,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y6  : virtual ::ccc::EE4x8 {
  virtual void  abc(); // _ZN3ccc7FF4x8y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x8y63efgEv
  ~FF4x8y6(); // tgen
  FF4x8y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y63abcEv");}
void  ccc::FF4x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y63efgEv");}
ccc::FF4x8y6 ::~FF4x8y6(){ note_dtor("_ZN3ccc7FF4x8y6E", this);} // tgen
ccc::FF4x8y6 ::FF4x8y6(){ note_ctor("_ZN3ccc7FF4x8y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y6E, buf);
    ::ccc::FF4x8y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y6E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y6E);
    dp->::ccc::FF4x8y6::~FF4x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y6E(Test__ZN3ccc7FF4x8y6E, "_ZN3ccc7FF4x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y6C1Ev();
extern void _ZN3ccc7FF4x8y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y6E[] = {
  NSPAIR(_ZN3ccc7FF4x8y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7FF4x8y63abcEv();
extern void _ZN3ccc7FF4x8y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y6E[] = {
  {&(_ZTVN3ccc7FF4x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y6E[];
static VTBL_ENTRY alt_thunk_names1095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y6E = {  "_ZN3ccc7FF4x8y6E", // class name
  bases__ZN3ccc7FF4x8y6E, 2,
  &(vtc__ZN3ccc7FF4x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1095,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y7  : virtual ::ccc::EE4x8 {
  virtual void  abc(); // _ZN3ccc7FF4x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y73pqrEv
  ~FF4x8y7(); // tgen
  FF4x8y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y73abcEv");}
void  ccc::FF4x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y73pqrEv");}
ccc::FF4x8y7 ::~FF4x8y7(){ note_dtor("_ZN3ccc7FF4x8y7E", this);} // tgen
ccc::FF4x8y7 ::FF4x8y7(){ note_ctor("_ZN3ccc7FF4x8y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y7E, buf);
    ::ccc::FF4x8y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y7E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y7E);
    dp->::ccc::FF4x8y7::~FF4x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y7E(Test__ZN3ccc7FF4x8y7E, "_ZN3ccc7FF4x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y7C1Ev();
extern void _ZN3ccc7FF4x8y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y7E[] = {
  NSPAIR(_ZN3ccc7FF4x8y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y7E[];
extern void _ZN3ccc7FF4x8y73pqrEv();
extern void _ZN3ccc7FF4x8y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y7E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y7E[] = {
  {&(_ZTVN3ccc7FF4x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y7E[];
static VTBL_ENTRY alt_thunk_names1096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y7E = {  "_ZN3ccc7FF4x8y7E", // class name
  bases__ZN3ccc7FF4x8y7E, 2,
  &(vtc__ZN3ccc7FF4x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1096,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y8  : virtual ::ccc::EE4x8 {
  virtual void  efg(); // _ZN3ccc7FF4x8y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x8y83abcEv
  ~FF4x8y8(); // tgen
  FF4x8y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y83efgEv");}
void  ccc::FF4x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x8y83abcEv");}
ccc::FF4x8y8 ::~FF4x8y8(){ note_dtor("_ZN3ccc7FF4x8y8E", this);} // tgen
ccc::FF4x8y8 ::FF4x8y8(){ note_ctor("_ZN3ccc7FF4x8y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y8E, buf);
    ::ccc::FF4x8y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y8E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y8E);
    dp->::ccc::FF4x8y8::~FF4x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y8E(Test__ZN3ccc7FF4x8y8E, "_ZN3ccc7FF4x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y8C1Ev();
extern void _ZN3ccc7FF4x8y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y8E[] = {
  NSPAIR(_ZN3ccc7FF4x8y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7FF4x8y83abcEv();
extern void _ZN3ccc7FF4x8y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y8E[] = {
  {&(_ZTVN3ccc7FF4x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y8E[];
static VTBL_ENTRY alt_thunk_names1097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y8E = {  "_ZN3ccc7FF4x8y8E", // class name
  bases__ZN3ccc7FF4x8y8E, 2,
  &(vtc__ZN3ccc7FF4x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1097,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y9  : virtual ::ccc::EE4x8 {
  virtual void  efg(); // _ZN3ccc7FF4x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x8y93pqrEv
  ~FF4x8y9(); // tgen
  FF4x8y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x8y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x8y93efgEv");}
void  ccc::FF4x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x8y93pqrEv");}
ccc::FF4x8y9 ::~FF4x8y9(){ note_dtor("_ZN3ccc7FF4x8y9E", this);} // tgen
ccc::FF4x8y9 ::FF4x8y9(){ note_ctor("_ZN3ccc7FF4x8y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x8y9E, buf);
    ::ccc::FF4x8y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x8y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y9E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc7FF4x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x8y9E);
    dp->::ccc::FF4x8y9::~FF4x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x8y9E(Test__ZN3ccc7FF4x8y9E, "_ZN3ccc7FF4x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x8y9C1Ev();
extern void _ZN3ccc7FF4x8y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x8y9E[] = {
  NSPAIR(_ZN3ccc7FF4x8y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc7FF4x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y9E[];
extern void _ZN3ccc7FF4x8y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void _ZN3ccc7FF4x8y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x8y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x8y9E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x8y9E[] = {
  {&(_ZTVN3ccc7FF4x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x8y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_7FF4x8y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x8y9E[];
static VTBL_ENTRY alt_thunk_names1098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x8y9E = {  "_ZN3ccc7FF4x8y9E", // class name
  bases__ZN3ccc7FF4x8y9E, 2,
  &(vtc__ZN3ccc7FF4x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x8y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x8y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x8y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x8y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1098,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y10  : virtual ::ccc::EE4x8 {
  virtual void  pqr(); // _ZN3ccc8FF4x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x8y103abcEv
  ~FF4x8y10(); // tgen
  FF4x8y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x8y103pqrEv");}
void  ccc::FF4x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x8y103abcEv");}
ccc::FF4x8y10 ::~FF4x8y10(){ note_dtor("_ZN3ccc8FF4x8y10E", this);} // tgen
ccc::FF4x8y10 ::FF4x8y10(){ note_ctor("_ZN3ccc8FF4x8y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y10E, buf);
    ::ccc::FF4x8y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y10E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y10E);
    dp->::ccc::FF4x8y10::~FF4x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y10E(Test__ZN3ccc8FF4x8y10E, "_ZN3ccc8FF4x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y10C1Ev();
extern void _ZN3ccc8FF4x8y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y10E[] = {
  NSPAIR(_ZN3ccc8FF4x8y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y10E[];
extern void _ZN3ccc8FF4x8y103pqrEv();
extern void _ZN3ccc8FF4x8y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y10E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y10E[] = {
  {&(_ZTVN3ccc8FF4x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y10E[];
static VTBL_ENTRY alt_thunk_names1099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y10E = {  "_ZN3ccc8FF4x8y10E", // class name
  bases__ZN3ccc8FF4x8y10E, 2,
  &(vtc__ZN3ccc8FF4x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1099,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y11  : virtual ::ccc::EE4x8 {
  virtual void  pqr(); // _ZN3ccc8FF4x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x8y113efgEv
  ~FF4x8y11(); // tgen
  FF4x8y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x8y113pqrEv");}
void  ccc::FF4x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x8y113efgEv");}
ccc::FF4x8y11 ::~FF4x8y11(){ note_dtor("_ZN3ccc8FF4x8y11E", this);} // tgen
ccc::FF4x8y11 ::FF4x8y11(){ note_ctor("_ZN3ccc8FF4x8y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y11E, buf);
    ::ccc::FF4x8y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y11E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y11E);
    dp->::ccc::FF4x8y11::~FF4x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y11E(Test__ZN3ccc8FF4x8y11E, "_ZN3ccc8FF4x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y11C1Ev();
extern void _ZN3ccc8FF4x8y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y11E[] = {
  NSPAIR(_ZN3ccc8FF4x8y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y11E[];
extern void _ZN3ccc8FF4x8y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x8y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y11E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y11E[] = {
  {&(_ZTVN3ccc8FF4x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y11E[];
static VTBL_ENTRY alt_thunk_names1100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y11E = {  "_ZN3ccc8FF4x8y11E", // class name
  bases__ZN3ccc8FF4x8y11E, 2,
  &(vtc__ZN3ccc8FF4x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y12  : virtual ::ccc::EE4x8 {
  virtual void  abc(); // _ZN3ccc8FF4x8y123abcEv
  ~FF4x8y12(); // tgen
  FF4x8y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x8y123abcEv");}
ccc::FF4x8y12 ::~FF4x8y12(){ note_dtor("_ZN3ccc8FF4x8y12E", this);} // tgen
ccc::FF4x8y12 ::FF4x8y12(){ note_ctor("_ZN3ccc8FF4x8y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y12E, buf);
    ::ccc::FF4x8y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y12E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y12E);
    dp->::ccc::FF4x8y12::~FF4x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y12E(Test__ZN3ccc8FF4x8y12E, "_ZN3ccc8FF4x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y12C1Ev();
extern void _ZN3ccc8FF4x8y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y12E[] = {
  NSPAIR(_ZN3ccc8FF4x8y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x8y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y12E[] = {
  {&(_ZTVN3ccc8FF4x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y12E[];
static VTBL_ENTRY alt_thunk_names1101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y12E = {  "_ZN3ccc8FF4x8y12E", // class name
  bases__ZN3ccc8FF4x8y12E, 2,
  &(vtc__ZN3ccc8FF4x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y13  : virtual ::ccc::EE4x8 {
  virtual void  efg(); // _ZN3ccc8FF4x8y133efgEv
  ~FF4x8y13(); // tgen
  FF4x8y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x8y133efgEv");}
ccc::FF4x8y13 ::~FF4x8y13(){ note_dtor("_ZN3ccc8FF4x8y13E", this);} // tgen
ccc::FF4x8y13 ::FF4x8y13(){ note_ctor("_ZN3ccc8FF4x8y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y13E, buf);
    ::ccc::FF4x8y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y13E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y13E);
    dp->::ccc::FF4x8y13::~FF4x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y13E(Test__ZN3ccc8FF4x8y13E, "_ZN3ccc8FF4x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y13C1Ev();
extern void _ZN3ccc8FF4x8y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y13E[] = {
  NSPAIR(_ZN3ccc8FF4x8y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x8y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y13E[] = {
  {&(_ZTVN3ccc8FF4x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y13E[];
static VTBL_ENTRY alt_thunk_names1102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y13E = {  "_ZN3ccc8FF4x8y13E", // class name
  bases__ZN3ccc8FF4x8y13E, 2,
  &(vtc__ZN3ccc8FF4x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y14  : virtual ::ccc::EE4x8 {
  virtual void  pqr(); // _ZN3ccc8FF4x8y143pqrEv
  ~FF4x8y14(); // tgen
  FF4x8y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x8y143pqrEv");}
ccc::FF4x8y14 ::~FF4x8y14(){ note_dtor("_ZN3ccc8FF4x8y14E", this);} // tgen
ccc::FF4x8y14 ::FF4x8y14(){ note_ctor("_ZN3ccc8FF4x8y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y14E, buf);
    ::ccc::FF4x8y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y14E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y14E);
    dp->::ccc::FF4x8y14::~FF4x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y14E(Test__ZN3ccc8FF4x8y14E, "_ZN3ccc8FF4x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y14C1Ev();
extern void _ZN3ccc8FF4x8y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y14E[] = {
  NSPAIR(_ZN3ccc8FF4x8y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y14E[];
extern void _ZN3ccc8FF4x8y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x8y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y14E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y14E[] = {
  {&(_ZTVN3ccc8FF4x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y14E[];
static VTBL_ENTRY alt_thunk_names1103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y14E = {  "_ZN3ccc8FF4x8y14E", // class name
  bases__ZN3ccc8FF4x8y14E, 2,
  &(vtc__ZN3ccc8FF4x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1103,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x8y15  : virtual ::ccc::EE4x8 {
  ~FF4x8y15(); // tgen
  FF4x8y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x8y15E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v2}}
}
namespace ccc { 
ccc::FF4x8y15 ::~FF4x8y15(){ note_dtor("_ZN3ccc8FF4x8y15E", this);} // tgen
ccc::FF4x8y15 ::FF4x8y15(){ note_ctor("_ZN3ccc8FF4x8y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x8y15E, buf);
    ::ccc::FF4x8y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x8y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y15E");
    check_base_class_offset(lv, (::ccc::EE4x8*), 0, "_ZN3ccc8FF4x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x8y15E);
    dp->::ccc::FF4x8y15::~FF4x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x8y15E(Test__ZN3ccc8FF4x8y15E, "_ZN3ccc8FF4x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x8y15C1Ev();
extern void _ZN3ccc8FF4x8y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x8y15E[] = {
  NSPAIR(_ZN3ccc8FF4x8y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x8E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x8E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x8E[];
static Base_Class bases__ZN3ccc8FF4x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x8y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv)();
extern void _ZN3ccc5EE4x83abcEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv)();
extern void _ZN3ccc5EE4x83efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x8y15E[] = {
  {&(_ZTVN3ccc8FF4x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x8y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x8E__NS_8FF4x8y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x8y15E[];
static VTBL_ENTRY alt_thunk_names1104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x83efgEv,_ZTv0_n20_N3ccc5EE4x83efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc5EE4x83abcEv,_ZTv0_n16_N3ccc5EE4x83abcEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x83abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x8y15E = {  "_ZN3ccc8FF4x8y15E", // class name
  bases__ZN3ccc8FF4x8y15E, 2,
  &(vtc__ZN3ccc8FF4x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x8y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x8y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x8y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x8y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1104,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y0  : virtual ::ccc::EE4x9 {
  virtual void  abc(); // _ZN3ccc7FF4x9y03abcEv
  virtual void  efg(); // _ZN3ccc7FF4x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y03pqrEv
  ~FF4x9y0(); // tgen
  FF4x9y0(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y03abcEv");}
void  ccc::FF4x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y03efgEv");}
void  ccc::FF4x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y03pqrEv");}
ccc::FF4x9y0 ::~FF4x9y0(){ note_dtor("_ZN3ccc7FF4x9y0E", this);} // tgen
ccc::FF4x9y0 ::FF4x9y0(){ note_ctor("_ZN3ccc7FF4x9y0E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y0E, buf);
    ::ccc::FF4x9y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y0E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y0E);
    dp->::ccc::FF4x9y0::~FF4x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y0E(Test__ZN3ccc7FF4x9y0E, "_ZN3ccc7FF4x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y0C1Ev();
extern void _ZN3ccc7FF4x9y0D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y0E[] = {
  NSPAIR(_ZN3ccc7FF4x9y0C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y0E[];
extern void _ZN3ccc7FF4x9y03pqrEv();
extern void _ZN3ccc7FF4x9y03abcEv();
extern void _ZN3ccc7FF4x9y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y0E[] = {
  {&(_ZTVN3ccc7FF4x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y0E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y0E[];
static VTBL_ENTRY alt_thunk_names1105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y0E = {  "_ZN3ccc7FF4x9y0E", // class name
  bases__ZN3ccc7FF4x9y0E, 2,
  &(vtc__ZN3ccc7FF4x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1105,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y1  : virtual ::ccc::EE4x9 {
  virtual void  abc(); // _ZN3ccc7FF4x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x9y13efgEv
  ~FF4x9y1(); // tgen
  FF4x9y1(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y13abcEv");}
void  ccc::FF4x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y13pqrEv");}
void  ccc::FF4x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y13efgEv");}
ccc::FF4x9y1 ::~FF4x9y1(){ note_dtor("_ZN3ccc7FF4x9y1E", this);} // tgen
ccc::FF4x9y1 ::FF4x9y1(){ note_ctor("_ZN3ccc7FF4x9y1E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y1E, buf);
    ::ccc::FF4x9y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y1E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y1E);
    dp->::ccc::FF4x9y1::~FF4x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y1E(Test__ZN3ccc7FF4x9y1E, "_ZN3ccc7FF4x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y1C1Ev();
extern void _ZN3ccc7FF4x9y1D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y1E[] = {
  NSPAIR(_ZN3ccc7FF4x9y1C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y1E[];
extern void _ZN3ccc7FF4x9y13pqrEv();
extern void _ZN3ccc7FF4x9y13abcEv();
extern void _ZN3ccc7FF4x9y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y1E[] = {
  {&(_ZTVN3ccc7FF4x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y1E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y1E[];
static VTBL_ENTRY alt_thunk_names1106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y1E = {  "_ZN3ccc7FF4x9y1E", // class name
  bases__ZN3ccc7FF4x9y1E, 2,
  &(vtc__ZN3ccc7FF4x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1106,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y2  : virtual ::ccc::EE4x9 {
  virtual void  efg(); // _ZN3ccc7FF4x9y23efgEv
  virtual void  abc(); // _ZN3ccc7FF4x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y23pqrEv
  ~FF4x9y2(); // tgen
  FF4x9y2(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y23efgEv");}
void  ccc::FF4x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y23abcEv");}
void  ccc::FF4x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y23pqrEv");}
ccc::FF4x9y2 ::~FF4x9y2(){ note_dtor("_ZN3ccc7FF4x9y2E", this);} // tgen
ccc::FF4x9y2 ::FF4x9y2(){ note_ctor("_ZN3ccc7FF4x9y2E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y2E, buf);
    ::ccc::FF4x9y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y2E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y2E);
    dp->::ccc::FF4x9y2::~FF4x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y2E(Test__ZN3ccc7FF4x9y2E, "_ZN3ccc7FF4x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y2C1Ev();
extern void _ZN3ccc7FF4x9y2D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y2E[] = {
  NSPAIR(_ZN3ccc7FF4x9y2C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y2E[];
extern void _ZN3ccc7FF4x9y23pqrEv();
extern void _ZN3ccc7FF4x9y23abcEv();
extern void _ZN3ccc7FF4x9y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y2E[] = {
  {&(_ZTVN3ccc7FF4x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y2E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y2E[];
static VTBL_ENTRY alt_thunk_names1107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y2E = {  "_ZN3ccc7FF4x9y2E", // class name
  bases__ZN3ccc7FF4x9y2E, 2,
  &(vtc__ZN3ccc7FF4x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1107,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y3  : virtual ::ccc::EE4x9 {
  virtual void  efg(); // _ZN3ccc7FF4x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x9y33abcEv
  ~FF4x9y3(); // tgen
  FF4x9y3(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y33efgEv");}
void  ccc::FF4x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y33pqrEv");}
void  ccc::FF4x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y33abcEv");}
ccc::FF4x9y3 ::~FF4x9y3(){ note_dtor("_ZN3ccc7FF4x9y3E", this);} // tgen
ccc::FF4x9y3 ::FF4x9y3(){ note_ctor("_ZN3ccc7FF4x9y3E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y3E, buf);
    ::ccc::FF4x9y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y3E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y3E);
    dp->::ccc::FF4x9y3::~FF4x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y3E(Test__ZN3ccc7FF4x9y3E, "_ZN3ccc7FF4x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y3C1Ev();
extern void _ZN3ccc7FF4x9y3D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y3E[] = {
  NSPAIR(_ZN3ccc7FF4x9y3C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y3E[];
extern void _ZN3ccc7FF4x9y33pqrEv();
extern void _ZN3ccc7FF4x9y33abcEv();
extern void _ZN3ccc7FF4x9y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y3E[] = {
  {&(_ZTVN3ccc7FF4x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y3E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y3E[];
static VTBL_ENTRY alt_thunk_names1108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y3E = {  "_ZN3ccc7FF4x9y3E", // class name
  bases__ZN3ccc7FF4x9y3E, 2,
  &(vtc__ZN3ccc7FF4x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y4  : virtual ::ccc::EE4x9 {
  virtual void  pqr(); // _ZN3ccc7FF4x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7FF4x9y43abcEv
  virtual void  efg(); // _ZN3ccc7FF4x9y43efgEv
  ~FF4x9y4(); // tgen
  FF4x9y4(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y43pqrEv");}
void  ccc::FF4x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y43abcEv");}
void  ccc::FF4x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y43efgEv");}
ccc::FF4x9y4 ::~FF4x9y4(){ note_dtor("_ZN3ccc7FF4x9y4E", this);} // tgen
ccc::FF4x9y4 ::FF4x9y4(){ note_ctor("_ZN3ccc7FF4x9y4E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y4E, buf);
    ::ccc::FF4x9y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y4E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y4E);
    dp->::ccc::FF4x9y4::~FF4x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y4E(Test__ZN3ccc7FF4x9y4E, "_ZN3ccc7FF4x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y4C1Ev();
extern void _ZN3ccc7FF4x9y4D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y4E[] = {
  NSPAIR(_ZN3ccc7FF4x9y4C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y4E[];
extern void _ZN3ccc7FF4x9y43pqrEv();
extern void _ZN3ccc7FF4x9y43abcEv();
extern void _ZN3ccc7FF4x9y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y4E[] = {
  {&(_ZTVN3ccc7FF4x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y4E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y4E[];
static VTBL_ENTRY alt_thunk_names1109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y4E = {  "_ZN3ccc7FF4x9y4E", // class name
  bases__ZN3ccc7FF4x9y4E, 2,
  &(vtc__ZN3ccc7FF4x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y5  : virtual ::ccc::EE4x9 {
  virtual void  pqr(); // _ZN3ccc7FF4x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7FF4x9y53efgEv
  virtual void  abc(); // _ZN3ccc7FF4x9y53abcEv
  ~FF4x9y5(); // tgen
  FF4x9y5(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y53pqrEv");}
void  ccc::FF4x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y53efgEv");}
void  ccc::FF4x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y53abcEv");}
ccc::FF4x9y5 ::~FF4x9y5(){ note_dtor("_ZN3ccc7FF4x9y5E", this);} // tgen
ccc::FF4x9y5 ::FF4x9y5(){ note_ctor("_ZN3ccc7FF4x9y5E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y5E, buf);
    ::ccc::FF4x9y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y5E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y5E);
    dp->::ccc::FF4x9y5::~FF4x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y5E(Test__ZN3ccc7FF4x9y5E, "_ZN3ccc7FF4x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y5C1Ev();
extern void _ZN3ccc7FF4x9y5D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y5E[] = {
  NSPAIR(_ZN3ccc7FF4x9y5C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y5E[];
extern void _ZN3ccc7FF4x9y53pqrEv();
extern void _ZN3ccc7FF4x9y53abcEv();
extern void _ZN3ccc7FF4x9y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y5E[] = {
  {&(_ZTVN3ccc7FF4x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y5E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y5E[];
static VTBL_ENTRY alt_thunk_names1110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y5E = {  "_ZN3ccc7FF4x9y5E", // class name
  bases__ZN3ccc7FF4x9y5E, 2,
  &(vtc__ZN3ccc7FF4x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y6  : virtual ::ccc::EE4x9 {
  virtual void  abc(); // _ZN3ccc7FF4x9y63abcEv
  virtual void  efg(); // _ZN3ccc7FF4x9y63efgEv
  ~FF4x9y6(); // tgen
  FF4x9y6(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y63abcEv");}
void  ccc::FF4x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y63efgEv");}
ccc::FF4x9y6 ::~FF4x9y6(){ note_dtor("_ZN3ccc7FF4x9y6E", this);} // tgen
ccc::FF4x9y6 ::FF4x9y6(){ note_ctor("_ZN3ccc7FF4x9y6E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y6E, buf);
    ::ccc::FF4x9y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y6E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y6E);
    dp->::ccc::FF4x9y6::~FF4x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y6E(Test__ZN3ccc7FF4x9y6E, "_ZN3ccc7FF4x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y6C1Ev();
extern void _ZN3ccc7FF4x9y6D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y6E[] = {
  NSPAIR(_ZN3ccc7FF4x9y6C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x9y63abcEv();
extern void _ZN3ccc7FF4x9y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y6E[] = {
  {&(_ZTVN3ccc7FF4x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y6E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y6E[];
static VTBL_ENTRY alt_thunk_names1111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y6E = {  "_ZN3ccc7FF4x9y6E", // class name
  bases__ZN3ccc7FF4x9y6E, 2,
  &(vtc__ZN3ccc7FF4x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y7  : virtual ::ccc::EE4x9 {
  virtual void  abc(); // _ZN3ccc7FF4x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y73pqrEv
  ~FF4x9y7(); // tgen
  FF4x9y7(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y73abcEv");}
void  ccc::FF4x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y73pqrEv");}
ccc::FF4x9y7 ::~FF4x9y7(){ note_dtor("_ZN3ccc7FF4x9y7E", this);} // tgen
ccc::FF4x9y7 ::FF4x9y7(){ note_ctor("_ZN3ccc7FF4x9y7E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y7E, buf);
    ::ccc::FF4x9y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y7E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y7E);
    dp->::ccc::FF4x9y7::~FF4x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y7E(Test__ZN3ccc7FF4x9y7E, "_ZN3ccc7FF4x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y7C1Ev();
extern void _ZN3ccc7FF4x9y7D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y7E[] = {
  NSPAIR(_ZN3ccc7FF4x9y7C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y7E[];
extern void _ZN3ccc7FF4x9y73pqrEv();
extern void _ZN3ccc7FF4x9y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y7E[] = {
  {&(_ZTVN3ccc7FF4x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y7E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y7E[];
static VTBL_ENTRY alt_thunk_names1112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y7E = {  "_ZN3ccc7FF4x9y7E", // class name
  bases__ZN3ccc7FF4x9y7E, 2,
  &(vtc__ZN3ccc7FF4x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y8  : virtual ::ccc::EE4x9 {
  virtual void  efg(); // _ZN3ccc7FF4x9y83efgEv
  virtual void  abc(); // _ZN3ccc7FF4x9y83abcEv
  ~FF4x9y8(); // tgen
  FF4x9y8(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y83efgEv");}
void  ccc::FF4x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7FF4x9y83abcEv");}
ccc::FF4x9y8 ::~FF4x9y8(){ note_dtor("_ZN3ccc7FF4x9y8E", this);} // tgen
ccc::FF4x9y8 ::FF4x9y8(){ note_ctor("_ZN3ccc7FF4x9y8E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y8E, buf);
    ::ccc::FF4x9y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y8E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y8E);
    dp->::ccc::FF4x9y8::~FF4x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y8E(Test__ZN3ccc7FF4x9y8E, "_ZN3ccc7FF4x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y8C1Ev();
extern void _ZN3ccc7FF4x9y8D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y8E[] = {
  NSPAIR(_ZN3ccc7FF4x9y8C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc7FF4x9y83abcEv();
extern void _ZN3ccc7FF4x9y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y8E[] = {
  {&(_ZTVN3ccc7FF4x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y8E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y8E[];
static VTBL_ENTRY alt_thunk_names1113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y8E = {  "_ZN3ccc7FF4x9y8E", // class name
  bases__ZN3ccc7FF4x9y8E, 2,
  &(vtc__ZN3ccc7FF4x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y9  : virtual ::ccc::EE4x9 {
  virtual void  efg(); // _ZN3ccc7FF4x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7FF4x9y93pqrEv
  ~FF4x9y9(); // tgen
  FF4x9y9(); // tgen
};
//SIG(1 _ZN3ccc7FF4x9y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7FF4x9y93efgEv");}
void  ccc::FF4x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7FF4x9y93pqrEv");}
ccc::FF4x9y9 ::~FF4x9y9(){ note_dtor("_ZN3ccc7FF4x9y9E", this);} // tgen
ccc::FF4x9y9 ::FF4x9y9(){ note_ctor("_ZN3ccc7FF4x9y9E", this);} // tgen
}
static void Test__ZN3ccc7FF4x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7FF4x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc7FF4x9y9E, buf);
    ::ccc::FF4x9y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc7FF4x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7FF4x9y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y9E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc7FF4x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7FF4x9y9E);
    dp->::ccc::FF4x9y9::~FF4x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7FF4x9y9E(Test__ZN3ccc7FF4x9y9E, "_ZN3ccc7FF4x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc7FF4x9y9C1Ev();
extern void _ZN3ccc7FF4x9y9D1Ev();
Name_Map name_map__ZN3ccc7FF4x9y9E[] = {
  NSPAIR(_ZN3ccc7FF4x9y9C1Ev),
  NSPAIR(_ZN3ccc7FF4x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc7FF4x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y9E[];
extern void _ZN3ccc7FF4x9y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7FF4x9y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7FF4x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7FF4x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7FF4x9y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7FF4x9y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc7FF4x9y9E[] = {
  {&(_ZTVN3ccc7FF4x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y9E[7]),  7,10},
  {&(_ZTVN3ccc7FF4x9y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_7FF4x9y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc7FF4x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7FF4x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7FF4x9y9E[];
static VTBL_ENTRY alt_thunk_names1114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7FF4x9y9E = {  "_ZN3ccc7FF4x9y9E", // class name
  bases__ZN3ccc7FF4x9y9E, 2,
  &(vtc__ZN3ccc7FF4x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7FF4x9y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc7FF4x9y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7FF4x9y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7FF4x9y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y10  : virtual ::ccc::EE4x9 {
  virtual void  pqr(); // _ZN3ccc8FF4x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x9y103abcEv
  ~FF4x9y10(); // tgen
  FF4x9y10(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x9y103pqrEv");}
void  ccc::FF4x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x9y103abcEv");}
ccc::FF4x9y10 ::~FF4x9y10(){ note_dtor("_ZN3ccc8FF4x9y10E", this);} // tgen
ccc::FF4x9y10 ::FF4x9y10(){ note_ctor("_ZN3ccc8FF4x9y10E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y10E, buf);
    ::ccc::FF4x9y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y10E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y10E);
    dp->::ccc::FF4x9y10::~FF4x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y10E(Test__ZN3ccc8FF4x9y10E, "_ZN3ccc8FF4x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y10C1Ev();
extern void _ZN3ccc8FF4x9y10D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y10E[] = {
  NSPAIR(_ZN3ccc8FF4x9y10C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y10E[];
extern void _ZN3ccc8FF4x9y103pqrEv();
extern void _ZN3ccc8FF4x9y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y10E[] = {
  {&(_ZTVN3ccc8FF4x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y10E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y10E[];
static VTBL_ENTRY alt_thunk_names1115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y10E = {  "_ZN3ccc8FF4x9y10E", // class name
  bases__ZN3ccc8FF4x9y10E, 2,
  &(vtc__ZN3ccc8FF4x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y11  : virtual ::ccc::EE4x9 {
  virtual void  pqr(); // _ZN3ccc8FF4x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x9y113efgEv
  ~FF4x9y11(); // tgen
  FF4x9y11(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x9y113pqrEv");}
void  ccc::FF4x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x9y113efgEv");}
ccc::FF4x9y11 ::~FF4x9y11(){ note_dtor("_ZN3ccc8FF4x9y11E", this);} // tgen
ccc::FF4x9y11 ::FF4x9y11(){ note_ctor("_ZN3ccc8FF4x9y11E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y11E, buf);
    ::ccc::FF4x9y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y11E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y11E);
    dp->::ccc::FF4x9y11::~FF4x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y11E(Test__ZN3ccc8FF4x9y11E, "_ZN3ccc8FF4x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y11C1Ev();
extern void _ZN3ccc8FF4x9y11D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y11E[] = {
  NSPAIR(_ZN3ccc8FF4x9y11C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y11E[];
extern void _ZN3ccc8FF4x9y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x9y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y11E[] = {
  {&(_ZTVN3ccc8FF4x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y11E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y11E[];
static VTBL_ENTRY alt_thunk_names1116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y11E = {  "_ZN3ccc8FF4x9y11E", // class name
  bases__ZN3ccc8FF4x9y11E, 2,
  &(vtc__ZN3ccc8FF4x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y12  : virtual ::ccc::EE4x9 {
  virtual void  abc(); // _ZN3ccc8FF4x9y123abcEv
  ~FF4x9y12(); // tgen
  FF4x9y12(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x9y123abcEv");}
ccc::FF4x9y12 ::~FF4x9y12(){ note_dtor("_ZN3ccc8FF4x9y12E", this);} // tgen
ccc::FF4x9y12 ::FF4x9y12(){ note_ctor("_ZN3ccc8FF4x9y12E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y12E, buf);
    ::ccc::FF4x9y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y12E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y12E);
    dp->::ccc::FF4x9y12::~FF4x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y12E(Test__ZN3ccc8FF4x9y12E, "_ZN3ccc8FF4x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y12C1Ev();
extern void _ZN3ccc8FF4x9y12D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y12E[] = {
  NSPAIR(_ZN3ccc8FF4x9y12C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x9y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y12E[] = {
  {&(_ZTVN3ccc8FF4x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y12E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y12E[];
static VTBL_ENTRY alt_thunk_names1117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y12E = {  "_ZN3ccc8FF4x9y12E", // class name
  bases__ZN3ccc8FF4x9y12E, 2,
  &(vtc__ZN3ccc8FF4x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y13  : virtual ::ccc::EE4x9 {
  virtual void  efg(); // _ZN3ccc8FF4x9y133efgEv
  ~FF4x9y13(); // tgen
  FF4x9y13(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x9y133efgEv");}
ccc::FF4x9y13 ::~FF4x9y13(){ note_dtor("_ZN3ccc8FF4x9y13E", this);} // tgen
ccc::FF4x9y13 ::FF4x9y13(){ note_ctor("_ZN3ccc8FF4x9y13E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y13E, buf);
    ::ccc::FF4x9y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y13E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y13E);
    dp->::ccc::FF4x9y13::~FF4x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y13E(Test__ZN3ccc8FF4x9y13E, "_ZN3ccc8FF4x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y13C1Ev();
extern void _ZN3ccc8FF4x9y13D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y13E[] = {
  NSPAIR(_ZN3ccc8FF4x9y13C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x9y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y13E[] = {
  {&(_ZTVN3ccc8FF4x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y13E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y13E[];
static VTBL_ENTRY alt_thunk_names1118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y13E = {  "_ZN3ccc8FF4x9y13E", // class name
  bases__ZN3ccc8FF4x9y13E, 2,
  &(vtc__ZN3ccc8FF4x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y14  : virtual ::ccc::EE4x9 {
  virtual void  pqr(); // _ZN3ccc8FF4x9y143pqrEv
  ~FF4x9y14(); // tgen
  FF4x9y14(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x9y143pqrEv");}
ccc::FF4x9y14 ::~FF4x9y14(){ note_dtor("_ZN3ccc8FF4x9y14E", this);} // tgen
ccc::FF4x9y14 ::FF4x9y14(){ note_ctor("_ZN3ccc8FF4x9y14E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y14E, buf);
    ::ccc::FF4x9y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y14E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y14E);
    dp->::ccc::FF4x9y14::~FF4x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y14E(Test__ZN3ccc8FF4x9y14E, "_ZN3ccc8FF4x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y14C1Ev();
extern void _ZN3ccc8FF4x9y14D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y14E[] = {
  NSPAIR(_ZN3ccc8FF4x9y14C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y14E[];
extern void _ZN3ccc8FF4x9y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y14E[] = {
  {&(_ZTVN3ccc8FF4x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y14E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y14E[];
static VTBL_ENTRY alt_thunk_names1119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y14E = {  "_ZN3ccc8FF4x9y14E", // class name
  bases__ZN3ccc8FF4x9y14E, 2,
  &(vtc__ZN3ccc8FF4x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x9y15  : virtual ::ccc::EE4x9 {
  ~FF4x9y15(); // tgen
  FF4x9y15(); // tgen
};
//SIG(1 _ZN3ccc8FF4x9y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1 v2}}
}
namespace ccc { 
ccc::FF4x9y15 ::~FF4x9y15(){ note_dtor("_ZN3ccc8FF4x9y15E", this);} // tgen
ccc::FF4x9y15 ::FF4x9y15(){ note_ctor("_ZN3ccc8FF4x9y15E", this);} // tgen
}
static void Test__ZN3ccc8FF4x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x9y15E, buf);
    ::ccc::FF4x9y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x9y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y15E");
    check_base_class_offset(lv, (::ccc::EE4x9*), 0, "_ZN3ccc8FF4x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x9y15E);
    dp->::ccc::FF4x9y15::~FF4x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x9y15E(Test__ZN3ccc8FF4x9y15E, "_ZN3ccc8FF4x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x9y15C1Ev();
extern void _ZN3ccc8FF4x9y15D1Ev();
Name_Map name_map__ZN3ccc8FF4x9y15E[] = {
  NSPAIR(_ZN3ccc8FF4x9y15C1Ev),
  NSPAIR(_ZN3ccc8FF4x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc5EE4x9E;
extern VTBL_ENTRY _ZTIN3ccc5EE4x9E[];
extern  VTBL_ENTRY _ZTVN3ccc5EE4x9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc5EE4x9E[];
static Base_Class bases__ZN3ccc8FF4x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc5EE4x9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x9y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x9y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv)();
extern void _ZN3ccc5EE4x93pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv)();
extern void _ZN3ccc5EE4x93efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc5EE4x9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x9y15E[] = {
  {&(_ZTVN3ccc8FF4x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y15E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x9y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc5EE4x9E__NS_8FF4x9y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x9y15E[];
static VTBL_ENTRY alt_thunk_names1120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc5EE4x93efgEv,_ZTv0_n20_N3ccc5EE4x93efgEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc5EE4x93pqrEv,_ZTv0_n12_N3ccc5EE4x93pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  (VTBL_ENTRY)_ZN3ccc5EE4x93pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x9y15E = {  "_ZN3ccc8FF4x9y15E", // class name
  bases__ZN3ccc8FF4x9y15E, 2,
  &(vtc__ZN3ccc8FF4x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x9y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x9y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x9y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x9y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y0  : virtual ::ccc::EE4x10 {
  virtual void  abc(); // _ZN3ccc8FF4x10y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y03pqrEv
  ~FF4x10y0(); // tgen
  FF4x10y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y03abcEv");}
void  ccc::FF4x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y03efgEv");}
void  ccc::FF4x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y03pqrEv");}
ccc::FF4x10y0 ::~FF4x10y0(){ note_dtor("_ZN3ccc8FF4x10y0E", this);} // tgen
ccc::FF4x10y0 ::FF4x10y0(){ note_ctor("_ZN3ccc8FF4x10y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y0E, buf);
    ::ccc::FF4x10y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y0E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y0E);
    dp->::ccc::FF4x10y0::~FF4x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y0E(Test__ZN3ccc8FF4x10y0E, "_ZN3ccc8FF4x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y0C1Ev();
extern void _ZN3ccc8FF4x10y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y0E[] = {
  NSPAIR(_ZN3ccc8FF4x10y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y0E[];
extern void _ZN3ccc8FF4x10y03pqrEv();
extern void _ZN3ccc8FF4x10y03abcEv();
extern void _ZN3ccc8FF4x10y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y0E[] = {
  {&(_ZTVN3ccc8FF4x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y0E[];
static VTBL_ENTRY alt_thunk_names1121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y0E = {  "_ZN3ccc8FF4x10y0E", // class name
  bases__ZN3ccc8FF4x10y0E, 2,
  &(vtc__ZN3ccc8FF4x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1121,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y1  : virtual ::ccc::EE4x10 {
  virtual void  abc(); // _ZN3ccc8FF4x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x10y13efgEv
  ~FF4x10y1(); // tgen
  FF4x10y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y13abcEv");}
void  ccc::FF4x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y13pqrEv");}
void  ccc::FF4x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y13efgEv");}
ccc::FF4x10y1 ::~FF4x10y1(){ note_dtor("_ZN3ccc8FF4x10y1E", this);} // tgen
ccc::FF4x10y1 ::FF4x10y1(){ note_ctor("_ZN3ccc8FF4x10y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y1E, buf);
    ::ccc::FF4x10y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y1E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y1E);
    dp->::ccc::FF4x10y1::~FF4x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y1E(Test__ZN3ccc8FF4x10y1E, "_ZN3ccc8FF4x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y1C1Ev();
extern void _ZN3ccc8FF4x10y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y1E[] = {
  NSPAIR(_ZN3ccc8FF4x10y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y1E[];
extern void _ZN3ccc8FF4x10y13pqrEv();
extern void _ZN3ccc8FF4x10y13abcEv();
extern void _ZN3ccc8FF4x10y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y1E[] = {
  {&(_ZTVN3ccc8FF4x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y1E[];
static VTBL_ENTRY alt_thunk_names1122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y1E = {  "_ZN3ccc8FF4x10y1E", // class name
  bases__ZN3ccc8FF4x10y1E, 2,
  &(vtc__ZN3ccc8FF4x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1122,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y2  : virtual ::ccc::EE4x10 {
  virtual void  efg(); // _ZN3ccc8FF4x10y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y23pqrEv
  ~FF4x10y2(); // tgen
  FF4x10y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y23efgEv");}
void  ccc::FF4x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y23abcEv");}
void  ccc::FF4x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y23pqrEv");}
ccc::FF4x10y2 ::~FF4x10y2(){ note_dtor("_ZN3ccc8FF4x10y2E", this);} // tgen
ccc::FF4x10y2 ::FF4x10y2(){ note_ctor("_ZN3ccc8FF4x10y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y2E, buf);
    ::ccc::FF4x10y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y2E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y2E);
    dp->::ccc::FF4x10y2::~FF4x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y2E(Test__ZN3ccc8FF4x10y2E, "_ZN3ccc8FF4x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y2C1Ev();
extern void _ZN3ccc8FF4x10y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y2E[] = {
  NSPAIR(_ZN3ccc8FF4x10y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y2E[];
extern void _ZN3ccc8FF4x10y23pqrEv();
extern void _ZN3ccc8FF4x10y23abcEv();
extern void _ZN3ccc8FF4x10y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y2E[] = {
  {&(_ZTVN3ccc8FF4x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y2E[];
static VTBL_ENTRY alt_thunk_names1123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y2E = {  "_ZN3ccc8FF4x10y2E", // class name
  bases__ZN3ccc8FF4x10y2E, 2,
  &(vtc__ZN3ccc8FF4x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1123,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y3  : virtual ::ccc::EE4x10 {
  virtual void  efg(); // _ZN3ccc8FF4x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x10y33abcEv
  ~FF4x10y3(); // tgen
  FF4x10y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y33efgEv");}
void  ccc::FF4x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y33pqrEv");}
void  ccc::FF4x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y33abcEv");}
ccc::FF4x10y3 ::~FF4x10y3(){ note_dtor("_ZN3ccc8FF4x10y3E", this);} // tgen
ccc::FF4x10y3 ::FF4x10y3(){ note_ctor("_ZN3ccc8FF4x10y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y3E, buf);
    ::ccc::FF4x10y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y3E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y3E);
    dp->::ccc::FF4x10y3::~FF4x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y3E(Test__ZN3ccc8FF4x10y3E, "_ZN3ccc8FF4x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y3C1Ev();
extern void _ZN3ccc8FF4x10y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y3E[] = {
  NSPAIR(_ZN3ccc8FF4x10y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y3E[];
extern void _ZN3ccc8FF4x10y33pqrEv();
extern void _ZN3ccc8FF4x10y33abcEv();
extern void _ZN3ccc8FF4x10y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y3E[] = {
  {&(_ZTVN3ccc8FF4x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y3E[];
static VTBL_ENTRY alt_thunk_names1124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y3E = {  "_ZN3ccc8FF4x10y3E", // class name
  bases__ZN3ccc8FF4x10y3E, 2,
  &(vtc__ZN3ccc8FF4x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y4  : virtual ::ccc::EE4x10 {
  virtual void  pqr(); // _ZN3ccc8FF4x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x10y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x10y43efgEv
  ~FF4x10y4(); // tgen
  FF4x10y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y43pqrEv");}
void  ccc::FF4x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y43abcEv");}
void  ccc::FF4x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y43efgEv");}
ccc::FF4x10y4 ::~FF4x10y4(){ note_dtor("_ZN3ccc8FF4x10y4E", this);} // tgen
ccc::FF4x10y4 ::FF4x10y4(){ note_ctor("_ZN3ccc8FF4x10y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y4E, buf);
    ::ccc::FF4x10y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y4E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y4E);
    dp->::ccc::FF4x10y4::~FF4x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y4E(Test__ZN3ccc8FF4x10y4E, "_ZN3ccc8FF4x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y4C1Ev();
extern void _ZN3ccc8FF4x10y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y4E[] = {
  NSPAIR(_ZN3ccc8FF4x10y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y4E[];
extern void _ZN3ccc8FF4x10y43pqrEv();
extern void _ZN3ccc8FF4x10y43abcEv();
extern void _ZN3ccc8FF4x10y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y4E[] = {
  {&(_ZTVN3ccc8FF4x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y4E[];
static VTBL_ENTRY alt_thunk_names1125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y4E = {  "_ZN3ccc8FF4x10y4E", // class name
  bases__ZN3ccc8FF4x10y4E, 2,
  &(vtc__ZN3ccc8FF4x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1125,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y5  : virtual ::ccc::EE4x10 {
  virtual void  pqr(); // _ZN3ccc8FF4x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x10y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x10y53abcEv
  ~FF4x10y5(); // tgen
  FF4x10y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y53pqrEv");}
void  ccc::FF4x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y53efgEv");}
void  ccc::FF4x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y53abcEv");}
ccc::FF4x10y5 ::~FF4x10y5(){ note_dtor("_ZN3ccc8FF4x10y5E", this);} // tgen
ccc::FF4x10y5 ::FF4x10y5(){ note_ctor("_ZN3ccc8FF4x10y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y5E, buf);
    ::ccc::FF4x10y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y5E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y5E);
    dp->::ccc::FF4x10y5::~FF4x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y5E(Test__ZN3ccc8FF4x10y5E, "_ZN3ccc8FF4x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y5C1Ev();
extern void _ZN3ccc8FF4x10y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y5E[] = {
  NSPAIR(_ZN3ccc8FF4x10y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y5E[];
extern void _ZN3ccc8FF4x10y53pqrEv();
extern void _ZN3ccc8FF4x10y53abcEv();
extern void _ZN3ccc8FF4x10y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y5E[] = {
  {&(_ZTVN3ccc8FF4x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y5E[];
static VTBL_ENTRY alt_thunk_names1126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y5E = {  "_ZN3ccc8FF4x10y5E", // class name
  bases__ZN3ccc8FF4x10y5E, 2,
  &(vtc__ZN3ccc8FF4x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y6  : virtual ::ccc::EE4x10 {
  virtual void  abc(); // _ZN3ccc8FF4x10y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x10y63efgEv
  ~FF4x10y6(); // tgen
  FF4x10y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y63abcEv");}
void  ccc::FF4x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y63efgEv");}
ccc::FF4x10y6 ::~FF4x10y6(){ note_dtor("_ZN3ccc8FF4x10y6E", this);} // tgen
ccc::FF4x10y6 ::FF4x10y6(){ note_ctor("_ZN3ccc8FF4x10y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y6E, buf);
    ::ccc::FF4x10y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y6E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y6E);
    dp->::ccc::FF4x10y6::~FF4x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y6E(Test__ZN3ccc8FF4x10y6E, "_ZN3ccc8FF4x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y6C1Ev();
extern void _ZN3ccc8FF4x10y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y6E[] = {
  NSPAIR(_ZN3ccc8FF4x10y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x10y63abcEv();
extern void _ZN3ccc8FF4x10y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y6E[] = {
  {&(_ZTVN3ccc8FF4x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y6E[];
static VTBL_ENTRY alt_thunk_names1127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y6E = {  "_ZN3ccc8FF4x10y6E", // class name
  bases__ZN3ccc8FF4x10y6E, 2,
  &(vtc__ZN3ccc8FF4x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y7  : virtual ::ccc::EE4x10 {
  virtual void  abc(); // _ZN3ccc8FF4x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y73pqrEv
  ~FF4x10y7(); // tgen
  FF4x10y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y73abcEv");}
void  ccc::FF4x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y73pqrEv");}
ccc::FF4x10y7 ::~FF4x10y7(){ note_dtor("_ZN3ccc8FF4x10y7E", this);} // tgen
ccc::FF4x10y7 ::FF4x10y7(){ note_ctor("_ZN3ccc8FF4x10y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y7E, buf);
    ::ccc::FF4x10y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y7E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y7E);
    dp->::ccc::FF4x10y7::~FF4x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y7E(Test__ZN3ccc8FF4x10y7E, "_ZN3ccc8FF4x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y7C1Ev();
extern void _ZN3ccc8FF4x10y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y7E[] = {
  NSPAIR(_ZN3ccc8FF4x10y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y7E[];
extern void _ZN3ccc8FF4x10y73pqrEv();
extern void _ZN3ccc8FF4x10y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y7E[] = {
  {&(_ZTVN3ccc8FF4x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y7E[];
static VTBL_ENTRY alt_thunk_names1128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y7E = {  "_ZN3ccc8FF4x10y7E", // class name
  bases__ZN3ccc8FF4x10y7E, 2,
  &(vtc__ZN3ccc8FF4x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y8  : virtual ::ccc::EE4x10 {
  virtual void  efg(); // _ZN3ccc8FF4x10y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x10y83abcEv
  ~FF4x10y8(); // tgen
  FF4x10y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y83efgEv");}
void  ccc::FF4x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x10y83abcEv");}
ccc::FF4x10y8 ::~FF4x10y8(){ note_dtor("_ZN3ccc8FF4x10y8E", this);} // tgen
ccc::FF4x10y8 ::FF4x10y8(){ note_ctor("_ZN3ccc8FF4x10y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y8E, buf);
    ::ccc::FF4x10y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y8E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y8E);
    dp->::ccc::FF4x10y8::~FF4x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y8E(Test__ZN3ccc8FF4x10y8E, "_ZN3ccc8FF4x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y8C1Ev();
extern void _ZN3ccc8FF4x10y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y8E[] = {
  NSPAIR(_ZN3ccc8FF4x10y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x10y83abcEv();
extern void _ZN3ccc8FF4x10y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y8E[] = {
  {&(_ZTVN3ccc8FF4x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y8E[];
static VTBL_ENTRY alt_thunk_names1129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y8E = {  "_ZN3ccc8FF4x10y8E", // class name
  bases__ZN3ccc8FF4x10y8E, 2,
  &(vtc__ZN3ccc8FF4x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y9  : virtual ::ccc::EE4x10 {
  virtual void  efg(); // _ZN3ccc8FF4x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x10y93pqrEv
  ~FF4x10y9(); // tgen
  FF4x10y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x10y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x10y93efgEv");}
void  ccc::FF4x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x10y93pqrEv");}
ccc::FF4x10y9 ::~FF4x10y9(){ note_dtor("_ZN3ccc8FF4x10y9E", this);} // tgen
ccc::FF4x10y9 ::FF4x10y9(){ note_ctor("_ZN3ccc8FF4x10y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x10y9E, buf);
    ::ccc::FF4x10y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x10y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y9E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc8FF4x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x10y9E);
    dp->::ccc::FF4x10y9::~FF4x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x10y9E(Test__ZN3ccc8FF4x10y9E, "_ZN3ccc8FF4x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x10y9C1Ev();
extern void _ZN3ccc8FF4x10y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x10y9E[] = {
  NSPAIR(_ZN3ccc8FF4x10y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc8FF4x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y9E[];
extern void _ZN3ccc8FF4x10y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x10y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x10y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x10y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x10y9E[] = {
  {&(_ZTVN3ccc8FF4x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x10y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_8FF4x10y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x10y9E[];
static VTBL_ENTRY alt_thunk_names1130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x10y9E = {  "_ZN3ccc8FF4x10y9E", // class name
  bases__ZN3ccc8FF4x10y9E, 2,
  &(vtc__ZN3ccc8FF4x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x10y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x10y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x10y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x10y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y10  : virtual ::ccc::EE4x10 {
  virtual void  pqr(); // _ZN3ccc9FF4x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x10y103abcEv
  ~FF4x10y10(); // tgen
  FF4x10y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x10y103pqrEv");}
void  ccc::FF4x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x10y103abcEv");}
ccc::FF4x10y10 ::~FF4x10y10(){ note_dtor("_ZN3ccc9FF4x10y10E", this);} // tgen
ccc::FF4x10y10 ::FF4x10y10(){ note_ctor("_ZN3ccc9FF4x10y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y10E, buf);
    ::ccc::FF4x10y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y10E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y10E);
    dp->::ccc::FF4x10y10::~FF4x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y10E(Test__ZN3ccc9FF4x10y10E, "_ZN3ccc9FF4x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y10C1Ev();
extern void _ZN3ccc9FF4x10y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y10E[] = {
  NSPAIR(_ZN3ccc9FF4x10y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y10E[];
extern void _ZN3ccc9FF4x10y103pqrEv();
extern void _ZN3ccc9FF4x10y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y10E[] = {
  {&(_ZTVN3ccc9FF4x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y10E[];
static VTBL_ENTRY alt_thunk_names1131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y10E = {  "_ZN3ccc9FF4x10y10E", // class name
  bases__ZN3ccc9FF4x10y10E, 2,
  &(vtc__ZN3ccc9FF4x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y11  : virtual ::ccc::EE4x10 {
  virtual void  pqr(); // _ZN3ccc9FF4x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x10y113efgEv
  ~FF4x10y11(); // tgen
  FF4x10y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x10y113pqrEv");}
void  ccc::FF4x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x10y113efgEv");}
ccc::FF4x10y11 ::~FF4x10y11(){ note_dtor("_ZN3ccc9FF4x10y11E", this);} // tgen
ccc::FF4x10y11 ::FF4x10y11(){ note_ctor("_ZN3ccc9FF4x10y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y11E, buf);
    ::ccc::FF4x10y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y11E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y11E);
    dp->::ccc::FF4x10y11::~FF4x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y11E(Test__ZN3ccc9FF4x10y11E, "_ZN3ccc9FF4x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y11C1Ev();
extern void _ZN3ccc9FF4x10y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y11E[] = {
  NSPAIR(_ZN3ccc9FF4x10y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y11E[];
extern void _ZN3ccc9FF4x10y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF4x10y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y11E[] = {
  {&(_ZTVN3ccc9FF4x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y11E[];
static VTBL_ENTRY alt_thunk_names1132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y11E = {  "_ZN3ccc9FF4x10y11E", // class name
  bases__ZN3ccc9FF4x10y11E, 2,
  &(vtc__ZN3ccc9FF4x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y12  : virtual ::ccc::EE4x10 {
  virtual void  abc(); // _ZN3ccc9FF4x10y123abcEv
  ~FF4x10y12(); // tgen
  FF4x10y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x10y123abcEv");}
ccc::FF4x10y12 ::~FF4x10y12(){ note_dtor("_ZN3ccc9FF4x10y12E", this);} // tgen
ccc::FF4x10y12 ::FF4x10y12(){ note_ctor("_ZN3ccc9FF4x10y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y12E, buf);
    ::ccc::FF4x10y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y12E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y12E);
    dp->::ccc::FF4x10y12::~FF4x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y12E(Test__ZN3ccc9FF4x10y12E, "_ZN3ccc9FF4x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y12C1Ev();
extern void _ZN3ccc9FF4x10y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y12E[] = {
  NSPAIR(_ZN3ccc9FF4x10y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF4x10y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y12E[] = {
  {&(_ZTVN3ccc9FF4x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y12E[];
static VTBL_ENTRY alt_thunk_names1133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y12E = {  "_ZN3ccc9FF4x10y12E", // class name
  bases__ZN3ccc9FF4x10y12E, 2,
  &(vtc__ZN3ccc9FF4x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y13  : virtual ::ccc::EE4x10 {
  virtual void  efg(); // _ZN3ccc9FF4x10y133efgEv
  ~FF4x10y13(); // tgen
  FF4x10y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x10y133efgEv");}
ccc::FF4x10y13 ::~FF4x10y13(){ note_dtor("_ZN3ccc9FF4x10y13E", this);} // tgen
ccc::FF4x10y13 ::FF4x10y13(){ note_ctor("_ZN3ccc9FF4x10y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y13E, buf);
    ::ccc::FF4x10y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y13E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y13E);
    dp->::ccc::FF4x10y13::~FF4x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y13E(Test__ZN3ccc9FF4x10y13E, "_ZN3ccc9FF4x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y13C1Ev();
extern void _ZN3ccc9FF4x10y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y13E[] = {
  NSPAIR(_ZN3ccc9FF4x10y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc9FF4x10y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y13E[] = {
  {&(_ZTVN3ccc9FF4x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y13E[];
static VTBL_ENTRY alt_thunk_names1134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y13E = {  "_ZN3ccc9FF4x10y13E", // class name
  bases__ZN3ccc9FF4x10y13E, 2,
  &(vtc__ZN3ccc9FF4x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y14  : virtual ::ccc::EE4x10 {
  virtual void  pqr(); // _ZN3ccc9FF4x10y143pqrEv
  ~FF4x10y14(); // tgen
  FF4x10y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x10y143pqrEv");}
ccc::FF4x10y14 ::~FF4x10y14(){ note_dtor("_ZN3ccc9FF4x10y14E", this);} // tgen
ccc::FF4x10y14 ::FF4x10y14(){ note_ctor("_ZN3ccc9FF4x10y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y14E, buf);
    ::ccc::FF4x10y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y14E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y14E);
    dp->::ccc::FF4x10y14::~FF4x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y14E(Test__ZN3ccc9FF4x10y14E, "_ZN3ccc9FF4x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y14C1Ev();
extern void _ZN3ccc9FF4x10y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y14E[] = {
  NSPAIR(_ZN3ccc9FF4x10y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y14E[];
extern void _ZN3ccc9FF4x10y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x10y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y14E[] = {
  {&(_ZTVN3ccc9FF4x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y14E[];
static VTBL_ENTRY alt_thunk_names1135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y14E = {  "_ZN3ccc9FF4x10y14E", // class name
  bases__ZN3ccc9FF4x10y14E, 2,
  &(vtc__ZN3ccc9FF4x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x10y15  : virtual ::ccc::EE4x10 {
  ~FF4x10y15(); // tgen
  FF4x10y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x10y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v2}}
}
namespace ccc { 
ccc::FF4x10y15 ::~FF4x10y15(){ note_dtor("_ZN3ccc9FF4x10y15E", this);} // tgen
ccc::FF4x10y15 ::FF4x10y15(){ note_ctor("_ZN3ccc9FF4x10y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x10y15E, buf);
    ::ccc::FF4x10y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x10y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y15E");
    check_base_class_offset(lv, (::ccc::EE4x10*), 0, "_ZN3ccc9FF4x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x10y15E);
    dp->::ccc::FF4x10y15::~FF4x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x10y15E(Test__ZN3ccc9FF4x10y15E, "_ZN3ccc9FF4x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x10y15C1Ev();
extern void _ZN3ccc9FF4x10y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x10y15E[] = {
  NSPAIR(_ZN3ccc9FF4x10y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x10E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x10E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x10E[];
static Base_Class bases__ZN3ccc9FF4x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x10y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x10y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv)();
extern void _ZN3ccc6EE4x103pqrEv() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv)();
extern void _ZN3ccc6EE4x103abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x10y15E[] = {
  {&(_ZTVN3ccc9FF4x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x10y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x10E__NS_9FF4x10y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x10y15E[];
static VTBL_ENTRY alt_thunk_names1136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x103abcEv,_ZTv0_n16_N3ccc6EE4x103abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103abcEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x103pqrEv,_ZTv0_n12_N3ccc6EE4x103pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x103pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x10y15E = {  "_ZN3ccc9FF4x10y15E", // class name
  bases__ZN3ccc9FF4x10y15E, 2,
  &(vtc__ZN3ccc9FF4x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x10y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x10y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x10y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x10y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y0  : virtual ::ccc::EE4x11 {
  virtual void  abc(); // _ZN3ccc8FF4x11y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y03pqrEv
  ~FF4x11y0(); // tgen
  FF4x11y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y03abcEv");}
void  ccc::FF4x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y03efgEv");}
void  ccc::FF4x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y03pqrEv");}
ccc::FF4x11y0 ::~FF4x11y0(){ note_dtor("_ZN3ccc8FF4x11y0E", this);} // tgen
ccc::FF4x11y0 ::FF4x11y0(){ note_ctor("_ZN3ccc8FF4x11y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y0E, buf);
    ::ccc::FF4x11y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y0E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y0E);
    dp->::ccc::FF4x11y0::~FF4x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y0E(Test__ZN3ccc8FF4x11y0E, "_ZN3ccc8FF4x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y0C1Ev();
extern void _ZN3ccc8FF4x11y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y0E[] = {
  NSPAIR(_ZN3ccc8FF4x11y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y0E[];
extern void _ZN3ccc8FF4x11y03pqrEv();
extern void _ZN3ccc8FF4x11y03abcEv();
extern void _ZN3ccc8FF4x11y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y0E[] = {
  {&(_ZTVN3ccc8FF4x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y0E[];
static VTBL_ENTRY alt_thunk_names1137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y0E = {  "_ZN3ccc8FF4x11y0E", // class name
  bases__ZN3ccc8FF4x11y0E, 2,
  &(vtc__ZN3ccc8FF4x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y1  : virtual ::ccc::EE4x11 {
  virtual void  abc(); // _ZN3ccc8FF4x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x11y13efgEv
  ~FF4x11y1(); // tgen
  FF4x11y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y13abcEv");}
void  ccc::FF4x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y13pqrEv");}
void  ccc::FF4x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y13efgEv");}
ccc::FF4x11y1 ::~FF4x11y1(){ note_dtor("_ZN3ccc8FF4x11y1E", this);} // tgen
ccc::FF4x11y1 ::FF4x11y1(){ note_ctor("_ZN3ccc8FF4x11y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y1E, buf);
    ::ccc::FF4x11y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y1E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y1E);
    dp->::ccc::FF4x11y1::~FF4x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y1E(Test__ZN3ccc8FF4x11y1E, "_ZN3ccc8FF4x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y1C1Ev();
extern void _ZN3ccc8FF4x11y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y1E[] = {
  NSPAIR(_ZN3ccc8FF4x11y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y1E[];
extern void _ZN3ccc8FF4x11y13pqrEv();
extern void _ZN3ccc8FF4x11y13abcEv();
extern void _ZN3ccc8FF4x11y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y1E[] = {
  {&(_ZTVN3ccc8FF4x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y1E[];
static VTBL_ENTRY alt_thunk_names1138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y1E = {  "_ZN3ccc8FF4x11y1E", // class name
  bases__ZN3ccc8FF4x11y1E, 2,
  &(vtc__ZN3ccc8FF4x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y2  : virtual ::ccc::EE4x11 {
  virtual void  efg(); // _ZN3ccc8FF4x11y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y23pqrEv
  ~FF4x11y2(); // tgen
  FF4x11y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y23efgEv");}
void  ccc::FF4x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y23abcEv");}
void  ccc::FF4x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y23pqrEv");}
ccc::FF4x11y2 ::~FF4x11y2(){ note_dtor("_ZN3ccc8FF4x11y2E", this);} // tgen
ccc::FF4x11y2 ::FF4x11y2(){ note_ctor("_ZN3ccc8FF4x11y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y2E, buf);
    ::ccc::FF4x11y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y2E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y2E);
    dp->::ccc::FF4x11y2::~FF4x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y2E(Test__ZN3ccc8FF4x11y2E, "_ZN3ccc8FF4x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y2C1Ev();
extern void _ZN3ccc8FF4x11y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y2E[] = {
  NSPAIR(_ZN3ccc8FF4x11y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y2E[];
extern void _ZN3ccc8FF4x11y23pqrEv();
extern void _ZN3ccc8FF4x11y23abcEv();
extern void _ZN3ccc8FF4x11y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y2E[] = {
  {&(_ZTVN3ccc8FF4x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y2E[];
static VTBL_ENTRY alt_thunk_names1139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y2E = {  "_ZN3ccc8FF4x11y2E", // class name
  bases__ZN3ccc8FF4x11y2E, 2,
  &(vtc__ZN3ccc8FF4x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1139,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y3  : virtual ::ccc::EE4x11 {
  virtual void  efg(); // _ZN3ccc8FF4x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x11y33abcEv
  ~FF4x11y3(); // tgen
  FF4x11y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y33efgEv");}
void  ccc::FF4x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y33pqrEv");}
void  ccc::FF4x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y33abcEv");}
ccc::FF4x11y3 ::~FF4x11y3(){ note_dtor("_ZN3ccc8FF4x11y3E", this);} // tgen
ccc::FF4x11y3 ::FF4x11y3(){ note_ctor("_ZN3ccc8FF4x11y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y3E, buf);
    ::ccc::FF4x11y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y3E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y3E);
    dp->::ccc::FF4x11y3::~FF4x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y3E(Test__ZN3ccc8FF4x11y3E, "_ZN3ccc8FF4x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y3C1Ev();
extern void _ZN3ccc8FF4x11y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y3E[] = {
  NSPAIR(_ZN3ccc8FF4x11y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y3E[];
extern void _ZN3ccc8FF4x11y33pqrEv();
extern void _ZN3ccc8FF4x11y33abcEv();
extern void _ZN3ccc8FF4x11y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y3E[] = {
  {&(_ZTVN3ccc8FF4x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y3E[];
static VTBL_ENTRY alt_thunk_names1140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y3E = {  "_ZN3ccc8FF4x11y3E", // class name
  bases__ZN3ccc8FF4x11y3E, 2,
  &(vtc__ZN3ccc8FF4x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1140,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y4  : virtual ::ccc::EE4x11 {
  virtual void  pqr(); // _ZN3ccc8FF4x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x11y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x11y43efgEv
  ~FF4x11y4(); // tgen
  FF4x11y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y43pqrEv");}
void  ccc::FF4x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y43abcEv");}
void  ccc::FF4x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y43efgEv");}
ccc::FF4x11y4 ::~FF4x11y4(){ note_dtor("_ZN3ccc8FF4x11y4E", this);} // tgen
ccc::FF4x11y4 ::FF4x11y4(){ note_ctor("_ZN3ccc8FF4x11y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y4E, buf);
    ::ccc::FF4x11y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y4E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y4E);
    dp->::ccc::FF4x11y4::~FF4x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y4E(Test__ZN3ccc8FF4x11y4E, "_ZN3ccc8FF4x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y4C1Ev();
extern void _ZN3ccc8FF4x11y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y4E[] = {
  NSPAIR(_ZN3ccc8FF4x11y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y4E[];
extern void _ZN3ccc8FF4x11y43pqrEv();
extern void _ZN3ccc8FF4x11y43abcEv();
extern void _ZN3ccc8FF4x11y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y4E[] = {
  {&(_ZTVN3ccc8FF4x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y4E[];
static VTBL_ENTRY alt_thunk_names1141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y4E = {  "_ZN3ccc8FF4x11y4E", // class name
  bases__ZN3ccc8FF4x11y4E, 2,
  &(vtc__ZN3ccc8FF4x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1141,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y5  : virtual ::ccc::EE4x11 {
  virtual void  pqr(); // _ZN3ccc8FF4x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x11y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x11y53abcEv
  ~FF4x11y5(); // tgen
  FF4x11y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y53pqrEv");}
void  ccc::FF4x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y53efgEv");}
void  ccc::FF4x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y53abcEv");}
ccc::FF4x11y5 ::~FF4x11y5(){ note_dtor("_ZN3ccc8FF4x11y5E", this);} // tgen
ccc::FF4x11y5 ::FF4x11y5(){ note_ctor("_ZN3ccc8FF4x11y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y5E, buf);
    ::ccc::FF4x11y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y5E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y5E);
    dp->::ccc::FF4x11y5::~FF4x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y5E(Test__ZN3ccc8FF4x11y5E, "_ZN3ccc8FF4x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y5C1Ev();
extern void _ZN3ccc8FF4x11y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y5E[] = {
  NSPAIR(_ZN3ccc8FF4x11y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y5E[];
extern void _ZN3ccc8FF4x11y53pqrEv();
extern void _ZN3ccc8FF4x11y53abcEv();
extern void _ZN3ccc8FF4x11y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y5E[] = {
  {&(_ZTVN3ccc8FF4x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y5E[];
static VTBL_ENTRY alt_thunk_names1142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y5E = {  "_ZN3ccc8FF4x11y5E", // class name
  bases__ZN3ccc8FF4x11y5E, 2,
  &(vtc__ZN3ccc8FF4x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1142,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y6  : virtual ::ccc::EE4x11 {
  virtual void  abc(); // _ZN3ccc8FF4x11y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x11y63efgEv
  ~FF4x11y6(); // tgen
  FF4x11y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y63abcEv");}
void  ccc::FF4x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y63efgEv");}
ccc::FF4x11y6 ::~FF4x11y6(){ note_dtor("_ZN3ccc8FF4x11y6E", this);} // tgen
ccc::FF4x11y6 ::FF4x11y6(){ note_ctor("_ZN3ccc8FF4x11y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y6E, buf);
    ::ccc::FF4x11y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y6E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y6E);
    dp->::ccc::FF4x11y6::~FF4x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y6E(Test__ZN3ccc8FF4x11y6E, "_ZN3ccc8FF4x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y6C1Ev();
extern void _ZN3ccc8FF4x11y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y6E[] = {
  NSPAIR(_ZN3ccc8FF4x11y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x11y63abcEv();
extern void _ZN3ccc8FF4x11y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y6E[] = {
  {&(_ZTVN3ccc8FF4x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y6E[];
static VTBL_ENTRY alt_thunk_names1143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y6E = {  "_ZN3ccc8FF4x11y6E", // class name
  bases__ZN3ccc8FF4x11y6E, 2,
  &(vtc__ZN3ccc8FF4x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y7  : virtual ::ccc::EE4x11 {
  virtual void  abc(); // _ZN3ccc8FF4x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y73pqrEv
  ~FF4x11y7(); // tgen
  FF4x11y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y73abcEv");}
void  ccc::FF4x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y73pqrEv");}
ccc::FF4x11y7 ::~FF4x11y7(){ note_dtor("_ZN3ccc8FF4x11y7E", this);} // tgen
ccc::FF4x11y7 ::FF4x11y7(){ note_ctor("_ZN3ccc8FF4x11y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y7E, buf);
    ::ccc::FF4x11y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y7E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y7E);
    dp->::ccc::FF4x11y7::~FF4x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y7E(Test__ZN3ccc8FF4x11y7E, "_ZN3ccc8FF4x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y7C1Ev();
extern void _ZN3ccc8FF4x11y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y7E[] = {
  NSPAIR(_ZN3ccc8FF4x11y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y7E[];
extern void _ZN3ccc8FF4x11y73pqrEv();
extern void _ZN3ccc8FF4x11y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y7E[] = {
  {&(_ZTVN3ccc8FF4x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y7E[];
static VTBL_ENTRY alt_thunk_names1144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y7E = {  "_ZN3ccc8FF4x11y7E", // class name
  bases__ZN3ccc8FF4x11y7E, 2,
  &(vtc__ZN3ccc8FF4x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y8  : virtual ::ccc::EE4x11 {
  virtual void  efg(); // _ZN3ccc8FF4x11y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x11y83abcEv
  ~FF4x11y8(); // tgen
  FF4x11y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y83efgEv");}
void  ccc::FF4x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x11y83abcEv");}
ccc::FF4x11y8 ::~FF4x11y8(){ note_dtor("_ZN3ccc8FF4x11y8E", this);} // tgen
ccc::FF4x11y8 ::FF4x11y8(){ note_ctor("_ZN3ccc8FF4x11y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y8E, buf);
    ::ccc::FF4x11y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y8E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y8E);
    dp->::ccc::FF4x11y8::~FF4x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y8E(Test__ZN3ccc8FF4x11y8E, "_ZN3ccc8FF4x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y8C1Ev();
extern void _ZN3ccc8FF4x11y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y8E[] = {
  NSPAIR(_ZN3ccc8FF4x11y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x11y83abcEv();
extern void _ZN3ccc8FF4x11y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y8E[] = {
  {&(_ZTVN3ccc8FF4x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y8E[];
static VTBL_ENTRY alt_thunk_names1145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y8E = {  "_ZN3ccc8FF4x11y8E", // class name
  bases__ZN3ccc8FF4x11y8E, 2,
  &(vtc__ZN3ccc8FF4x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y9  : virtual ::ccc::EE4x11 {
  virtual void  efg(); // _ZN3ccc8FF4x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x11y93pqrEv
  ~FF4x11y9(); // tgen
  FF4x11y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x11y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x11y93efgEv");}
void  ccc::FF4x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x11y93pqrEv");}
ccc::FF4x11y9 ::~FF4x11y9(){ note_dtor("_ZN3ccc8FF4x11y9E", this);} // tgen
ccc::FF4x11y9 ::FF4x11y9(){ note_ctor("_ZN3ccc8FF4x11y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x11y9E, buf);
    ::ccc::FF4x11y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x11y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y9E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc8FF4x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x11y9E);
    dp->::ccc::FF4x11y9::~FF4x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x11y9E(Test__ZN3ccc8FF4x11y9E, "_ZN3ccc8FF4x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x11y9C1Ev();
extern void _ZN3ccc8FF4x11y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x11y9E[] = {
  NSPAIR(_ZN3ccc8FF4x11y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc8FF4x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y9E[];
extern void _ZN3ccc8FF4x11y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x11y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x11y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x11y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x11y9E[] = {
  {&(_ZTVN3ccc8FF4x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x11y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_8FF4x11y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x11y9E[];
static VTBL_ENTRY alt_thunk_names1146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x11y9E = {  "_ZN3ccc8FF4x11y9E", // class name
  bases__ZN3ccc8FF4x11y9E, 2,
  &(vtc__ZN3ccc8FF4x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x11y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x11y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x11y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x11y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y10  : virtual ::ccc::EE4x11 {
  virtual void  pqr(); // _ZN3ccc9FF4x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x11y103abcEv
  ~FF4x11y10(); // tgen
  FF4x11y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x11y103pqrEv");}
void  ccc::FF4x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x11y103abcEv");}
ccc::FF4x11y10 ::~FF4x11y10(){ note_dtor("_ZN3ccc9FF4x11y10E", this);} // tgen
ccc::FF4x11y10 ::FF4x11y10(){ note_ctor("_ZN3ccc9FF4x11y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y10E, buf);
    ::ccc::FF4x11y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y10E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y10E);
    dp->::ccc::FF4x11y10::~FF4x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y10E(Test__ZN3ccc9FF4x11y10E, "_ZN3ccc9FF4x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y10C1Ev();
extern void _ZN3ccc9FF4x11y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y10E[] = {
  NSPAIR(_ZN3ccc9FF4x11y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y10E[];
extern void _ZN3ccc9FF4x11y103pqrEv();
extern void _ZN3ccc9FF4x11y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y10E[] = {
  {&(_ZTVN3ccc9FF4x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y10E[];
static VTBL_ENTRY alt_thunk_names1147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y10E = {  "_ZN3ccc9FF4x11y10E", // class name
  bases__ZN3ccc9FF4x11y10E, 2,
  &(vtc__ZN3ccc9FF4x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y11  : virtual ::ccc::EE4x11 {
  virtual void  pqr(); // _ZN3ccc9FF4x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x11y113efgEv
  ~FF4x11y11(); // tgen
  FF4x11y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x11y113pqrEv");}
void  ccc::FF4x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x11y113efgEv");}
ccc::FF4x11y11 ::~FF4x11y11(){ note_dtor("_ZN3ccc9FF4x11y11E", this);} // tgen
ccc::FF4x11y11 ::FF4x11y11(){ note_ctor("_ZN3ccc9FF4x11y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y11E, buf);
    ::ccc::FF4x11y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y11E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y11E);
    dp->::ccc::FF4x11y11::~FF4x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y11E(Test__ZN3ccc9FF4x11y11E, "_ZN3ccc9FF4x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y11C1Ev();
extern void _ZN3ccc9FF4x11y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y11E[] = {
  NSPAIR(_ZN3ccc9FF4x11y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y11E[];
extern void _ZN3ccc9FF4x11y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x11y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y11E[] = {
  {&(_ZTVN3ccc9FF4x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y11E[];
static VTBL_ENTRY alt_thunk_names1148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y11E = {  "_ZN3ccc9FF4x11y11E", // class name
  bases__ZN3ccc9FF4x11y11E, 2,
  &(vtc__ZN3ccc9FF4x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y12  : virtual ::ccc::EE4x11 {
  virtual void  abc(); // _ZN3ccc9FF4x11y123abcEv
  ~FF4x11y12(); // tgen
  FF4x11y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2 v3} v1}
}
namespace ccc { 
void  ccc::FF4x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x11y123abcEv");}
ccc::FF4x11y12 ::~FF4x11y12(){ note_dtor("_ZN3ccc9FF4x11y12E", this);} // tgen
ccc::FF4x11y12 ::FF4x11y12(){ note_ctor("_ZN3ccc9FF4x11y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y12E, buf);
    ::ccc::FF4x11y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y12E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y12E);
    dp->::ccc::FF4x11y12::~FF4x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y12E(Test__ZN3ccc9FF4x11y12E, "_ZN3ccc9FF4x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y12C1Ev();
extern void _ZN3ccc9FF4x11y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y12E[] = {
  NSPAIR(_ZN3ccc9FF4x11y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF4x11y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y12E[] = {
  {&(_ZTVN3ccc9FF4x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y12E[];
static VTBL_ENTRY alt_thunk_names1149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y12E = {  "_ZN3ccc9FF4x11y12E", // class name
  bases__ZN3ccc9FF4x11y12E, 2,
  &(vtc__ZN3ccc9FF4x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y13  : virtual ::ccc::EE4x11 {
  virtual void  efg(); // _ZN3ccc9FF4x11y133efgEv
  ~FF4x11y13(); // tgen
  FF4x11y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2 v1} v1}
}
namespace ccc { 
void  ccc::FF4x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x11y133efgEv");}
ccc::FF4x11y13 ::~FF4x11y13(){ note_dtor("_ZN3ccc9FF4x11y13E", this);} // tgen
ccc::FF4x11y13 ::FF4x11y13(){ note_ctor("_ZN3ccc9FF4x11y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y13E, buf);
    ::ccc::FF4x11y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y13E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y13E);
    dp->::ccc::FF4x11y13::~FF4x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y13E(Test__ZN3ccc9FF4x11y13E, "_ZN3ccc9FF4x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y13C1Ev();
extern void _ZN3ccc9FF4x11y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y13E[] = {
  NSPAIR(_ZN3ccc9FF4x11y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x11y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y13E[] = {
  {&(_ZTVN3ccc9FF4x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y13E[];
static VTBL_ENTRY alt_thunk_names1150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y13E = {  "_ZN3ccc9FF4x11y13E", // class name
  bases__ZN3ccc9FF4x11y13E, 2,
  &(vtc__ZN3ccc9FF4x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y14  : virtual ::ccc::EE4x11 {
  virtual void  pqr(); // _ZN3ccc9FF4x11y143pqrEv
  ~FF4x11y14(); // tgen
  FF4x11y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2} v1}
}
namespace ccc { 
void  ccc::FF4x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x11y143pqrEv");}
ccc::FF4x11y14 ::~FF4x11y14(){ note_dtor("_ZN3ccc9FF4x11y14E", this);} // tgen
ccc::FF4x11y14 ::FF4x11y14(){ note_ctor("_ZN3ccc9FF4x11y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y14E, buf);
    ::ccc::FF4x11y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y14E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y14E);
    dp->::ccc::FF4x11y14::~FF4x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y14E(Test__ZN3ccc9FF4x11y14E, "_ZN3ccc9FF4x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y14C1Ev();
extern void _ZN3ccc9FF4x11y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y14E[] = {
  NSPAIR(_ZN3ccc9FF4x11y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y14E[];
extern void _ZN3ccc9FF4x11y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y14E[] = {
  {&(_ZTVN3ccc9FF4x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y14E[];
static VTBL_ENTRY alt_thunk_names1151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y14E = {  "_ZN3ccc9FF4x11y14E", // class name
  bases__ZN3ccc9FF4x11y14E, 2,
  &(vtc__ZN3ccc9FF4x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x11y15  : virtual ::ccc::EE4x11 {
  ~FF4x11y15(); // tgen
  FF4x11y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x11y15E) C1{ VBC2{ VBC3{ v1 v3 v2} v1 v2}}
}
namespace ccc { 
ccc::FF4x11y15 ::~FF4x11y15(){ note_dtor("_ZN3ccc9FF4x11y15E", this);} // tgen
ccc::FF4x11y15 ::FF4x11y15(){ note_ctor("_ZN3ccc9FF4x11y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x11y15E, buf);
    ::ccc::FF4x11y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x11y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y15E");
    check_base_class_offset(lv, (::ccc::EE4x11*), 0, "_ZN3ccc9FF4x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x11y15E);
    dp->::ccc::FF4x11y15::~FF4x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x11y15E(Test__ZN3ccc9FF4x11y15E, "_ZN3ccc9FF4x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x11y15C1Ev();
extern void _ZN3ccc9FF4x11y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x11y15E[] = {
  NSPAIR(_ZN3ccc9FF4x11y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x11E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x11E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x11E[];
static Base_Class bases__ZN3ccc9FF4x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x11y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x11y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv)();
extern void _ZN3ccc6EE4x113pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv)();
extern void _ZN3ccc6EE4x113efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x11y15E[] = {
  {&(_ZTVN3ccc9FF4x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x11y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x11E__NS_9FF4x11y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x11y15E[];
static VTBL_ENTRY alt_thunk_names1152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x113efgEv,_ZTv0_n20_N3ccc6EE4x113efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113efgEv,
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x113pqrEv,_ZTv0_n12_N3ccc6EE4x113pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x113pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x11y15E = {  "_ZN3ccc9FF4x11y15E", // class name
  bases__ZN3ccc9FF4x11y15E, 2,
  &(vtc__ZN3ccc9FF4x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x11y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x11y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x11y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x11y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y0  : virtual ::ccc::EE4x12 {
  virtual void  abc(); // _ZN3ccc8FF4x12y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y03pqrEv
  ~FF4x12y0(); // tgen
  FF4x12y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y03abcEv");}
void  ccc::FF4x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y03efgEv");}
void  ccc::FF4x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y03pqrEv");}
ccc::FF4x12y0 ::~FF4x12y0(){ note_dtor("_ZN3ccc8FF4x12y0E", this);} // tgen
ccc::FF4x12y0 ::FF4x12y0(){ note_ctor("_ZN3ccc8FF4x12y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y0E, buf);
    ::ccc::FF4x12y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y0E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y0E);
    dp->::ccc::FF4x12y0::~FF4x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y0E(Test__ZN3ccc8FF4x12y0E, "_ZN3ccc8FF4x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y0C1Ev();
extern void _ZN3ccc8FF4x12y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y0E[] = {
  NSPAIR(_ZN3ccc8FF4x12y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y0E[];
extern void _ZN3ccc8FF4x12y03pqrEv();
extern void _ZN3ccc8FF4x12y03abcEv();
extern void _ZN3ccc8FF4x12y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y0E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y0E[] = {
  {&(_ZTVN3ccc8FF4x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y0E[];
static VTBL_ENTRY alt_thunk_names1153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y0E = {  "_ZN3ccc8FF4x12y0E", // class name
  bases__ZN3ccc8FF4x12y0E, 2,
  &(vtc__ZN3ccc8FF4x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y1  : virtual ::ccc::EE4x12 {
  virtual void  abc(); // _ZN3ccc8FF4x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x12y13efgEv
  ~FF4x12y1(); // tgen
  FF4x12y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y13abcEv");}
void  ccc::FF4x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y13pqrEv");}
void  ccc::FF4x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y13efgEv");}
ccc::FF4x12y1 ::~FF4x12y1(){ note_dtor("_ZN3ccc8FF4x12y1E", this);} // tgen
ccc::FF4x12y1 ::FF4x12y1(){ note_ctor("_ZN3ccc8FF4x12y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y1E, buf);
    ::ccc::FF4x12y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y1E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y1E);
    dp->::ccc::FF4x12y1::~FF4x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y1E(Test__ZN3ccc8FF4x12y1E, "_ZN3ccc8FF4x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y1C1Ev();
extern void _ZN3ccc8FF4x12y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y1E[] = {
  NSPAIR(_ZN3ccc8FF4x12y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y1E[];
extern void _ZN3ccc8FF4x12y13pqrEv();
extern void _ZN3ccc8FF4x12y13abcEv();
extern void _ZN3ccc8FF4x12y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y1E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y1E[] = {
  {&(_ZTVN3ccc8FF4x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y1E[];
static VTBL_ENTRY alt_thunk_names1154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y1E = {  "_ZN3ccc8FF4x12y1E", // class name
  bases__ZN3ccc8FF4x12y1E, 2,
  &(vtc__ZN3ccc8FF4x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y2  : virtual ::ccc::EE4x12 {
  virtual void  efg(); // _ZN3ccc8FF4x12y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y23pqrEv
  ~FF4x12y2(); // tgen
  FF4x12y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y23efgEv");}
void  ccc::FF4x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y23abcEv");}
void  ccc::FF4x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y23pqrEv");}
ccc::FF4x12y2 ::~FF4x12y2(){ note_dtor("_ZN3ccc8FF4x12y2E", this);} // tgen
ccc::FF4x12y2 ::FF4x12y2(){ note_ctor("_ZN3ccc8FF4x12y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y2E, buf);
    ::ccc::FF4x12y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y2E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y2E);
    dp->::ccc::FF4x12y2::~FF4x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y2E(Test__ZN3ccc8FF4x12y2E, "_ZN3ccc8FF4x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y2C1Ev();
extern void _ZN3ccc8FF4x12y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y2E[] = {
  NSPAIR(_ZN3ccc8FF4x12y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y2E[];
extern void _ZN3ccc8FF4x12y23pqrEv();
extern void _ZN3ccc8FF4x12y23abcEv();
extern void _ZN3ccc8FF4x12y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y2E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y2E[] = {
  {&(_ZTVN3ccc8FF4x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y2E[];
static VTBL_ENTRY alt_thunk_names1155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y2E = {  "_ZN3ccc8FF4x12y2E", // class name
  bases__ZN3ccc8FF4x12y2E, 2,
  &(vtc__ZN3ccc8FF4x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y3  : virtual ::ccc::EE4x12 {
  virtual void  efg(); // _ZN3ccc8FF4x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x12y33abcEv
  ~FF4x12y3(); // tgen
  FF4x12y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y33efgEv");}
void  ccc::FF4x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y33pqrEv");}
void  ccc::FF4x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y33abcEv");}
ccc::FF4x12y3 ::~FF4x12y3(){ note_dtor("_ZN3ccc8FF4x12y3E", this);} // tgen
ccc::FF4x12y3 ::FF4x12y3(){ note_ctor("_ZN3ccc8FF4x12y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y3E, buf);
    ::ccc::FF4x12y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y3E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y3E);
    dp->::ccc::FF4x12y3::~FF4x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y3E(Test__ZN3ccc8FF4x12y3E, "_ZN3ccc8FF4x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y3C1Ev();
extern void _ZN3ccc8FF4x12y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y3E[] = {
  NSPAIR(_ZN3ccc8FF4x12y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y3E[];
extern void _ZN3ccc8FF4x12y33pqrEv();
extern void _ZN3ccc8FF4x12y33abcEv();
extern void _ZN3ccc8FF4x12y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y3E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y3E[] = {
  {&(_ZTVN3ccc8FF4x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y3E[];
static VTBL_ENTRY alt_thunk_names1156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y3E = {  "_ZN3ccc8FF4x12y3E", // class name
  bases__ZN3ccc8FF4x12y3E, 2,
  &(vtc__ZN3ccc8FF4x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y4  : virtual ::ccc::EE4x12 {
  virtual void  pqr(); // _ZN3ccc8FF4x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x12y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x12y43efgEv
  ~FF4x12y4(); // tgen
  FF4x12y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y43pqrEv");}
void  ccc::FF4x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y43abcEv");}
void  ccc::FF4x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y43efgEv");}
ccc::FF4x12y4 ::~FF4x12y4(){ note_dtor("_ZN3ccc8FF4x12y4E", this);} // tgen
ccc::FF4x12y4 ::FF4x12y4(){ note_ctor("_ZN3ccc8FF4x12y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y4E, buf);
    ::ccc::FF4x12y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y4E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y4E);
    dp->::ccc::FF4x12y4::~FF4x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y4E(Test__ZN3ccc8FF4x12y4E, "_ZN3ccc8FF4x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y4C1Ev();
extern void _ZN3ccc8FF4x12y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y4E[] = {
  NSPAIR(_ZN3ccc8FF4x12y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y4E[];
extern void _ZN3ccc8FF4x12y43pqrEv();
extern void _ZN3ccc8FF4x12y43abcEv();
extern void _ZN3ccc8FF4x12y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y4E[] = {
  {&(_ZTVN3ccc8FF4x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y4E[];
static VTBL_ENTRY alt_thunk_names1157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y4E = {  "_ZN3ccc8FF4x12y4E", // class name
  bases__ZN3ccc8FF4x12y4E, 2,
  &(vtc__ZN3ccc8FF4x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y5  : virtual ::ccc::EE4x12 {
  virtual void  pqr(); // _ZN3ccc8FF4x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x12y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x12y53abcEv
  ~FF4x12y5(); // tgen
  FF4x12y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y53pqrEv");}
void  ccc::FF4x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y53efgEv");}
void  ccc::FF4x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y53abcEv");}
ccc::FF4x12y5 ::~FF4x12y5(){ note_dtor("_ZN3ccc8FF4x12y5E", this);} // tgen
ccc::FF4x12y5 ::FF4x12y5(){ note_ctor("_ZN3ccc8FF4x12y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y5E, buf);
    ::ccc::FF4x12y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y5E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y5E);
    dp->::ccc::FF4x12y5::~FF4x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y5E(Test__ZN3ccc8FF4x12y5E, "_ZN3ccc8FF4x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y5C1Ev();
extern void _ZN3ccc8FF4x12y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y5E[] = {
  NSPAIR(_ZN3ccc8FF4x12y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y5E[];
extern void _ZN3ccc8FF4x12y53pqrEv();
extern void _ZN3ccc8FF4x12y53abcEv();
extern void _ZN3ccc8FF4x12y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y5E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y5E[] = {
  {&(_ZTVN3ccc8FF4x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y5E[];
static VTBL_ENTRY alt_thunk_names1158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y5E = {  "_ZN3ccc8FF4x12y5E", // class name
  bases__ZN3ccc8FF4x12y5E, 2,
  &(vtc__ZN3ccc8FF4x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y6  : virtual ::ccc::EE4x12 {
  virtual void  abc(); // _ZN3ccc8FF4x12y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x12y63efgEv
  ~FF4x12y6(); // tgen
  FF4x12y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y63abcEv");}
void  ccc::FF4x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y63efgEv");}
ccc::FF4x12y6 ::~FF4x12y6(){ note_dtor("_ZN3ccc8FF4x12y6E", this);} // tgen
ccc::FF4x12y6 ::FF4x12y6(){ note_ctor("_ZN3ccc8FF4x12y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y6E, buf);
    ::ccc::FF4x12y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y6E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y6E);
    dp->::ccc::FF4x12y6::~FF4x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y6E(Test__ZN3ccc8FF4x12y6E, "_ZN3ccc8FF4x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y6C1Ev();
extern void _ZN3ccc8FF4x12y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y6E[] = {
  NSPAIR(_ZN3ccc8FF4x12y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x12y63abcEv();
extern void _ZN3ccc8FF4x12y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y6E[] = {
  {&(_ZTVN3ccc8FF4x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y6E[];
static VTBL_ENTRY alt_thunk_names1159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y6E = {  "_ZN3ccc8FF4x12y6E", // class name
  bases__ZN3ccc8FF4x12y6E, 2,
  &(vtc__ZN3ccc8FF4x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y7  : virtual ::ccc::EE4x12 {
  virtual void  abc(); // _ZN3ccc8FF4x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y73pqrEv
  ~FF4x12y7(); // tgen
  FF4x12y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y73abcEv");}
void  ccc::FF4x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y73pqrEv");}
ccc::FF4x12y7 ::~FF4x12y7(){ note_dtor("_ZN3ccc8FF4x12y7E", this);} // tgen
ccc::FF4x12y7 ::FF4x12y7(){ note_ctor("_ZN3ccc8FF4x12y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y7E, buf);
    ::ccc::FF4x12y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y7E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y7E);
    dp->::ccc::FF4x12y7::~FF4x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y7E(Test__ZN3ccc8FF4x12y7E, "_ZN3ccc8FF4x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y7C1Ev();
extern void _ZN3ccc8FF4x12y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y7E[] = {
  NSPAIR(_ZN3ccc8FF4x12y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y7E[];
extern void _ZN3ccc8FF4x12y73pqrEv();
extern void _ZN3ccc8FF4x12y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y7E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y7E[] = {
  {&(_ZTVN3ccc8FF4x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y7E[];
static VTBL_ENTRY alt_thunk_names1160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y7E = {  "_ZN3ccc8FF4x12y7E", // class name
  bases__ZN3ccc8FF4x12y7E, 2,
  &(vtc__ZN3ccc8FF4x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y8  : virtual ::ccc::EE4x12 {
  virtual void  efg(); // _ZN3ccc8FF4x12y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x12y83abcEv
  ~FF4x12y8(); // tgen
  FF4x12y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y83efgEv");}
void  ccc::FF4x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x12y83abcEv");}
ccc::FF4x12y8 ::~FF4x12y8(){ note_dtor("_ZN3ccc8FF4x12y8E", this);} // tgen
ccc::FF4x12y8 ::FF4x12y8(){ note_ctor("_ZN3ccc8FF4x12y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y8E, buf);
    ::ccc::FF4x12y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y8E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y8E);
    dp->::ccc::FF4x12y8::~FF4x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y8E(Test__ZN3ccc8FF4x12y8E, "_ZN3ccc8FF4x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y8C1Ev();
extern void _ZN3ccc8FF4x12y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y8E[] = {
  NSPAIR(_ZN3ccc8FF4x12y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x12y83abcEv();
extern void _ZN3ccc8FF4x12y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y8E[] = {
  {&(_ZTVN3ccc8FF4x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y8E[];
static VTBL_ENTRY alt_thunk_names1161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y8E = {  "_ZN3ccc8FF4x12y8E", // class name
  bases__ZN3ccc8FF4x12y8E, 2,
  &(vtc__ZN3ccc8FF4x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y9  : virtual ::ccc::EE4x12 {
  virtual void  efg(); // _ZN3ccc8FF4x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x12y93pqrEv
  ~FF4x12y9(); // tgen
  FF4x12y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x12y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x12y93efgEv");}
void  ccc::FF4x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x12y93pqrEv");}
ccc::FF4x12y9 ::~FF4x12y9(){ note_dtor("_ZN3ccc8FF4x12y9E", this);} // tgen
ccc::FF4x12y9 ::FF4x12y9(){ note_ctor("_ZN3ccc8FF4x12y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x12y9E, buf);
    ::ccc::FF4x12y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x12y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y9E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc8FF4x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x12y9E);
    dp->::ccc::FF4x12y9::~FF4x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x12y9E(Test__ZN3ccc8FF4x12y9E, "_ZN3ccc8FF4x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x12y9C1Ev();
extern void _ZN3ccc8FF4x12y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x12y9E[] = {
  NSPAIR(_ZN3ccc8FF4x12y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc8FF4x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y9E[];
extern void _ZN3ccc8FF4x12y93pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc8FF4x12y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y93pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x12y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x12y9E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x12y9E[] = {
  {&(_ZTVN3ccc8FF4x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x12y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_8FF4x12y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x12y9E[];
static VTBL_ENTRY alt_thunk_names1162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x12y9E = {  "_ZN3ccc8FF4x12y9E", // class name
  bases__ZN3ccc8FF4x12y9E, 2,
  &(vtc__ZN3ccc8FF4x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x12y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x12y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x12y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x12y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y10  : virtual ::ccc::EE4x12 {
  virtual void  pqr(); // _ZN3ccc9FF4x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x12y103abcEv
  ~FF4x12y10(); // tgen
  FF4x12y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x12y103pqrEv");}
void  ccc::FF4x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x12y103abcEv");}
ccc::FF4x12y10 ::~FF4x12y10(){ note_dtor("_ZN3ccc9FF4x12y10E", this);} // tgen
ccc::FF4x12y10 ::FF4x12y10(){ note_ctor("_ZN3ccc9FF4x12y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y10E, buf);
    ::ccc::FF4x12y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y10E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y10E);
    dp->::ccc::FF4x12y10::~FF4x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y10E(Test__ZN3ccc9FF4x12y10E, "_ZN3ccc9FF4x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y10C1Ev();
extern void _ZN3ccc9FF4x12y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y10E[] = {
  NSPAIR(_ZN3ccc9FF4x12y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y10E[];
extern void _ZN3ccc9FF4x12y103pqrEv();
extern void _ZN3ccc9FF4x12y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y10E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y10E[] = {
  {&(_ZTVN3ccc9FF4x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y10E[];
static VTBL_ENTRY alt_thunk_names1163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y10E = {  "_ZN3ccc9FF4x12y10E", // class name
  bases__ZN3ccc9FF4x12y10E, 2,
  &(vtc__ZN3ccc9FF4x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y11  : virtual ::ccc::EE4x12 {
  virtual void  pqr(); // _ZN3ccc9FF4x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x12y113efgEv
  ~FF4x12y11(); // tgen
  FF4x12y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x12y113pqrEv");}
void  ccc::FF4x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x12y113efgEv");}
ccc::FF4x12y11 ::~FF4x12y11(){ note_dtor("_ZN3ccc9FF4x12y11E", this);} // tgen
ccc::FF4x12y11 ::FF4x12y11(){ note_ctor("_ZN3ccc9FF4x12y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y11E, buf);
    ::ccc::FF4x12y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y11E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y11E);
    dp->::ccc::FF4x12y11::~FF4x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y11E(Test__ZN3ccc9FF4x12y11E, "_ZN3ccc9FF4x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y11C1Ev();
extern void _ZN3ccc9FF4x12y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y11E[] = {
  NSPAIR(_ZN3ccc9FF4x12y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y11E[];
extern void _ZN3ccc9FF4x12y113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF4x12y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y11E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y11E[] = {
  {&(_ZTVN3ccc9FF4x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y11E[];
static VTBL_ENTRY alt_thunk_names1164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y11E = {  "_ZN3ccc9FF4x12y11E", // class name
  bases__ZN3ccc9FF4x12y11E, 2,
  &(vtc__ZN3ccc9FF4x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y12  : virtual ::ccc::EE4x12 {
  virtual void  abc(); // _ZN3ccc9FF4x12y123abcEv
  ~FF4x12y12(); // tgen
  FF4x12y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF4x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x12y123abcEv");}
ccc::FF4x12y12 ::~FF4x12y12(){ note_dtor("_ZN3ccc9FF4x12y12E", this);} // tgen
ccc::FF4x12y12 ::FF4x12y12(){ note_ctor("_ZN3ccc9FF4x12y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y12E, buf);
    ::ccc::FF4x12y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y12E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y12E);
    dp->::ccc::FF4x12y12::~FF4x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y12E(Test__ZN3ccc9FF4x12y12E, "_ZN3ccc9FF4x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y12C1Ev();
extern void _ZN3ccc9FF4x12y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y12E[] = {
  NSPAIR(_ZN3ccc9FF4x12y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9FF4x12y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y12E[] = {
  {&(_ZTVN3ccc9FF4x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y12E[];
static VTBL_ENTRY alt_thunk_names1165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y12E = {  "_ZN3ccc9FF4x12y12E", // class name
  bases__ZN3ccc9FF4x12y12E, 2,
  &(vtc__ZN3ccc9FF4x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y13  : virtual ::ccc::EE4x12 {
  virtual void  efg(); // _ZN3ccc9FF4x12y133efgEv
  ~FF4x12y13(); // tgen
  FF4x12y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y13E) C1{ VBC2{ VBC3{ v3 v2 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF4x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x12y133efgEv");}
ccc::FF4x12y13 ::~FF4x12y13(){ note_dtor("_ZN3ccc9FF4x12y13E", this);} // tgen
ccc::FF4x12y13 ::FF4x12y13(){ note_ctor("_ZN3ccc9FF4x12y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y13E, buf);
    ::ccc::FF4x12y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y13E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y13E);
    dp->::ccc::FF4x12y13::~FF4x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y13E(Test__ZN3ccc9FF4x12y13E, "_ZN3ccc9FF4x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y13C1Ev();
extern void _ZN3ccc9FF4x12y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y13E[] = {
  NSPAIR(_ZN3ccc9FF4x12y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc9FF4x12y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y13E[] = {
  {&(_ZTVN3ccc9FF4x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y13E[];
static VTBL_ENTRY alt_thunk_names1166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y13E = {  "_ZN3ccc9FF4x12y13E", // class name
  bases__ZN3ccc9FF4x12y13E, 2,
  &(vtc__ZN3ccc9FF4x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y14  : virtual ::ccc::EE4x12 {
  virtual void  pqr(); // _ZN3ccc9FF4x12y143pqrEv
  ~FF4x12y14(); // tgen
  FF4x12y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF4x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x12y143pqrEv");}
ccc::FF4x12y14 ::~FF4x12y14(){ note_dtor("_ZN3ccc9FF4x12y14E", this);} // tgen
ccc::FF4x12y14 ::FF4x12y14(){ note_ctor("_ZN3ccc9FF4x12y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y14E, buf);
    ::ccc::FF4x12y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y14E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y14E);
    dp->::ccc::FF4x12y14::~FF4x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y14E(Test__ZN3ccc9FF4x12y14E, "_ZN3ccc9FF4x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y14C1Ev();
extern void _ZN3ccc9FF4x12y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y14E[] = {
  NSPAIR(_ZN3ccc9FF4x12y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y14E[];
extern void _ZN3ccc9FF4x12y143pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x12y143pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y14E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y14E[] = {
  {&(_ZTVN3ccc9FF4x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y14E[];
static VTBL_ENTRY alt_thunk_names1167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y14E = {  "_ZN3ccc9FF4x12y14E", // class name
  bases__ZN3ccc9FF4x12y14E, 2,
  &(vtc__ZN3ccc9FF4x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x12y15  : virtual ::ccc::EE4x12 {
  ~FF4x12y15(); // tgen
  FF4x12y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x12y15E) C1{ VBC2{ VBC3{ v2 v1 v3} v1}}
}
namespace ccc { 
ccc::FF4x12y15 ::~FF4x12y15(){ note_dtor("_ZN3ccc9FF4x12y15E", this);} // tgen
ccc::FF4x12y15 ::FF4x12y15(){ note_ctor("_ZN3ccc9FF4x12y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x12y15E, buf);
    ::ccc::FF4x12y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x12y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y15E");
    check_base_class_offset(lv, (::ccc::EE4x12*), 0, "_ZN3ccc9FF4x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x12y15E);
    dp->::ccc::FF4x12y15::~FF4x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x12y15E(Test__ZN3ccc9FF4x12y15E, "_ZN3ccc9FF4x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x12y15C1Ev();
extern void _ZN3ccc9FF4x12y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x12y15E[] = {
  NSPAIR(_ZN3ccc9FF4x12y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x12E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x12E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x12E[];
static Base_Class bases__ZN3ccc9FF4x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x12y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv)();
extern void _ZN3ccc6EE4x123abcEv() __attribute__((weak));
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x12y15E[] = {
  {&(_ZTVN3ccc9FF4x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x12y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x12E__NS_9FF4x12y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x12y15E[];
static VTBL_ENTRY alt_thunk_names1168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc6EE4x123abcEv,_ZTv0_n16_N3ccc6EE4x123abcEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x123abcEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x12y15E = {  "_ZN3ccc9FF4x12y15E", // class name
  bases__ZN3ccc9FF4x12y15E, 2,
  &(vtc__ZN3ccc9FF4x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x12y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x12y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x12y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x12y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y0  : virtual ::ccc::EE4x13 {
  virtual void  abc(); // _ZN3ccc8FF4x13y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y03pqrEv
  ~FF4x13y0(); // tgen
  FF4x13y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y03abcEv");}
void  ccc::FF4x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y03efgEv");}
void  ccc::FF4x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y03pqrEv");}
ccc::FF4x13y0 ::~FF4x13y0(){ note_dtor("_ZN3ccc8FF4x13y0E", this);} // tgen
ccc::FF4x13y0 ::FF4x13y0(){ note_ctor("_ZN3ccc8FF4x13y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y0E, buf);
    ::ccc::FF4x13y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y0E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y0E);
    dp->::ccc::FF4x13y0::~FF4x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y0E(Test__ZN3ccc8FF4x13y0E, "_ZN3ccc8FF4x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y0C1Ev();
extern void _ZN3ccc8FF4x13y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y0E[] = {
  NSPAIR(_ZN3ccc8FF4x13y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y0E[];
extern void _ZN3ccc8FF4x13y03pqrEv();
extern void _ZN3ccc8FF4x13y03abcEv();
extern void _ZN3ccc8FF4x13y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y0E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y0E[] = {
  {&(_ZTVN3ccc8FF4x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y0E[];
static VTBL_ENTRY alt_thunk_names1169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y0E = {  "_ZN3ccc8FF4x13y0E", // class name
  bases__ZN3ccc8FF4x13y0E, 2,
  &(vtc__ZN3ccc8FF4x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y1  : virtual ::ccc::EE4x13 {
  virtual void  abc(); // _ZN3ccc8FF4x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x13y13efgEv
  ~FF4x13y1(); // tgen
  FF4x13y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y13abcEv");}
void  ccc::FF4x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y13pqrEv");}
void  ccc::FF4x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y13efgEv");}
ccc::FF4x13y1 ::~FF4x13y1(){ note_dtor("_ZN3ccc8FF4x13y1E", this);} // tgen
ccc::FF4x13y1 ::FF4x13y1(){ note_ctor("_ZN3ccc8FF4x13y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y1E, buf);
    ::ccc::FF4x13y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y1E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y1E);
    dp->::ccc::FF4x13y1::~FF4x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y1E(Test__ZN3ccc8FF4x13y1E, "_ZN3ccc8FF4x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y1C1Ev();
extern void _ZN3ccc8FF4x13y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y1E[] = {
  NSPAIR(_ZN3ccc8FF4x13y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y1E[];
extern void _ZN3ccc8FF4x13y13pqrEv();
extern void _ZN3ccc8FF4x13y13abcEv();
extern void _ZN3ccc8FF4x13y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y1E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y1E[] = {
  {&(_ZTVN3ccc8FF4x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y1E[];
static VTBL_ENTRY alt_thunk_names1170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y1E = {  "_ZN3ccc8FF4x13y1E", // class name
  bases__ZN3ccc8FF4x13y1E, 2,
  &(vtc__ZN3ccc8FF4x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y2  : virtual ::ccc::EE4x13 {
  virtual void  efg(); // _ZN3ccc8FF4x13y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y23pqrEv
  ~FF4x13y2(); // tgen
  FF4x13y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y23efgEv");}
void  ccc::FF4x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y23abcEv");}
void  ccc::FF4x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y23pqrEv");}
ccc::FF4x13y2 ::~FF4x13y2(){ note_dtor("_ZN3ccc8FF4x13y2E", this);} // tgen
ccc::FF4x13y2 ::FF4x13y2(){ note_ctor("_ZN3ccc8FF4x13y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y2E, buf);
    ::ccc::FF4x13y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y2E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y2E);
    dp->::ccc::FF4x13y2::~FF4x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y2E(Test__ZN3ccc8FF4x13y2E, "_ZN3ccc8FF4x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y2C1Ev();
extern void _ZN3ccc8FF4x13y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y2E[] = {
  NSPAIR(_ZN3ccc8FF4x13y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y2E[];
extern void _ZN3ccc8FF4x13y23pqrEv();
extern void _ZN3ccc8FF4x13y23abcEv();
extern void _ZN3ccc8FF4x13y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y2E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y2E[] = {
  {&(_ZTVN3ccc8FF4x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y2E[];
static VTBL_ENTRY alt_thunk_names1171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y2E = {  "_ZN3ccc8FF4x13y2E", // class name
  bases__ZN3ccc8FF4x13y2E, 2,
  &(vtc__ZN3ccc8FF4x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y3  : virtual ::ccc::EE4x13 {
  virtual void  efg(); // _ZN3ccc8FF4x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x13y33abcEv
  ~FF4x13y3(); // tgen
  FF4x13y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y33efgEv");}
void  ccc::FF4x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y33pqrEv");}
void  ccc::FF4x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y33abcEv");}
ccc::FF4x13y3 ::~FF4x13y3(){ note_dtor("_ZN3ccc8FF4x13y3E", this);} // tgen
ccc::FF4x13y3 ::FF4x13y3(){ note_ctor("_ZN3ccc8FF4x13y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y3E, buf);
    ::ccc::FF4x13y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y3E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y3E);
    dp->::ccc::FF4x13y3::~FF4x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y3E(Test__ZN3ccc8FF4x13y3E, "_ZN3ccc8FF4x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y3C1Ev();
extern void _ZN3ccc8FF4x13y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y3E[] = {
  NSPAIR(_ZN3ccc8FF4x13y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y3E[];
extern void _ZN3ccc8FF4x13y33pqrEv();
extern void _ZN3ccc8FF4x13y33abcEv();
extern void _ZN3ccc8FF4x13y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y3E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y3E[] = {
  {&(_ZTVN3ccc8FF4x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y3E[];
static VTBL_ENTRY alt_thunk_names1172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y3E = {  "_ZN3ccc8FF4x13y3E", // class name
  bases__ZN3ccc8FF4x13y3E, 2,
  &(vtc__ZN3ccc8FF4x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y4  : virtual ::ccc::EE4x13 {
  virtual void  pqr(); // _ZN3ccc8FF4x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x13y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x13y43efgEv
  ~FF4x13y4(); // tgen
  FF4x13y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y43pqrEv");}
void  ccc::FF4x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y43abcEv");}
void  ccc::FF4x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y43efgEv");}
ccc::FF4x13y4 ::~FF4x13y4(){ note_dtor("_ZN3ccc8FF4x13y4E", this);} // tgen
ccc::FF4x13y4 ::FF4x13y4(){ note_ctor("_ZN3ccc8FF4x13y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y4E, buf);
    ::ccc::FF4x13y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y4E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y4E);
    dp->::ccc::FF4x13y4::~FF4x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y4E(Test__ZN3ccc8FF4x13y4E, "_ZN3ccc8FF4x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y4C1Ev();
extern void _ZN3ccc8FF4x13y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y4E[] = {
  NSPAIR(_ZN3ccc8FF4x13y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y4E[];
extern void _ZN3ccc8FF4x13y43pqrEv();
extern void _ZN3ccc8FF4x13y43abcEv();
extern void _ZN3ccc8FF4x13y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y4E[] = {
  {&(_ZTVN3ccc8FF4x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y4E[];
static VTBL_ENTRY alt_thunk_names1173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y4E = {  "_ZN3ccc8FF4x13y4E", // class name
  bases__ZN3ccc8FF4x13y4E, 2,
  &(vtc__ZN3ccc8FF4x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y5  : virtual ::ccc::EE4x13 {
  virtual void  pqr(); // _ZN3ccc8FF4x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x13y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x13y53abcEv
  ~FF4x13y5(); // tgen
  FF4x13y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y53pqrEv");}
void  ccc::FF4x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y53efgEv");}
void  ccc::FF4x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y53abcEv");}
ccc::FF4x13y5 ::~FF4x13y5(){ note_dtor("_ZN3ccc8FF4x13y5E", this);} // tgen
ccc::FF4x13y5 ::FF4x13y5(){ note_ctor("_ZN3ccc8FF4x13y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y5E, buf);
    ::ccc::FF4x13y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y5E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y5E);
    dp->::ccc::FF4x13y5::~FF4x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y5E(Test__ZN3ccc8FF4x13y5E, "_ZN3ccc8FF4x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y5C1Ev();
extern void _ZN3ccc8FF4x13y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y5E[] = {
  NSPAIR(_ZN3ccc8FF4x13y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y5E[];
extern void _ZN3ccc8FF4x13y53pqrEv();
extern void _ZN3ccc8FF4x13y53abcEv();
extern void _ZN3ccc8FF4x13y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y5E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y5E[] = {
  {&(_ZTVN3ccc8FF4x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y5E[];
static VTBL_ENTRY alt_thunk_names1174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y5E = {  "_ZN3ccc8FF4x13y5E", // class name
  bases__ZN3ccc8FF4x13y5E, 2,
  &(vtc__ZN3ccc8FF4x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y6  : virtual ::ccc::EE4x13 {
  virtual void  abc(); // _ZN3ccc8FF4x13y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x13y63efgEv
  ~FF4x13y6(); // tgen
  FF4x13y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y63abcEv");}
void  ccc::FF4x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y63efgEv");}
ccc::FF4x13y6 ::~FF4x13y6(){ note_dtor("_ZN3ccc8FF4x13y6E", this);} // tgen
ccc::FF4x13y6 ::FF4x13y6(){ note_ctor("_ZN3ccc8FF4x13y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y6E, buf);
    ::ccc::FF4x13y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y6E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y6E);
    dp->::ccc::FF4x13y6::~FF4x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y6E(Test__ZN3ccc8FF4x13y6E, "_ZN3ccc8FF4x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y6C1Ev();
extern void _ZN3ccc8FF4x13y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y6E[] = {
  NSPAIR(_ZN3ccc8FF4x13y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x13y63abcEv();
extern void _ZN3ccc8FF4x13y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y6E[] = {
  {&(_ZTVN3ccc8FF4x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y6E[];
static VTBL_ENTRY alt_thunk_names1175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y6E = {  "_ZN3ccc8FF4x13y6E", // class name
  bases__ZN3ccc8FF4x13y6E, 2,
  &(vtc__ZN3ccc8FF4x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y7  : virtual ::ccc::EE4x13 {
  virtual void  abc(); // _ZN3ccc8FF4x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y73pqrEv
  ~FF4x13y7(); // tgen
  FF4x13y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y73abcEv");}
void  ccc::FF4x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y73pqrEv");}
ccc::FF4x13y7 ::~FF4x13y7(){ note_dtor("_ZN3ccc8FF4x13y7E", this);} // tgen
ccc::FF4x13y7 ::FF4x13y7(){ note_ctor("_ZN3ccc8FF4x13y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y7E, buf);
    ::ccc::FF4x13y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y7E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y7E);
    dp->::ccc::FF4x13y7::~FF4x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y7E(Test__ZN3ccc8FF4x13y7E, "_ZN3ccc8FF4x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y7C1Ev();
extern void _ZN3ccc8FF4x13y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y7E[] = {
  NSPAIR(_ZN3ccc8FF4x13y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y7E[];
extern void _ZN3ccc8FF4x13y73pqrEv();
extern void _ZN3ccc8FF4x13y73abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y7E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y7E[] = {
  {&(_ZTVN3ccc8FF4x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y7E[];
static VTBL_ENTRY alt_thunk_names1176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y7E = {  "_ZN3ccc8FF4x13y7E", // class name
  bases__ZN3ccc8FF4x13y7E, 2,
  &(vtc__ZN3ccc8FF4x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y8  : virtual ::ccc::EE4x13 {
  virtual void  efg(); // _ZN3ccc8FF4x13y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x13y83abcEv
  ~FF4x13y8(); // tgen
  FF4x13y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y83efgEv");}
void  ccc::FF4x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x13y83abcEv");}
ccc::FF4x13y8 ::~FF4x13y8(){ note_dtor("_ZN3ccc8FF4x13y8E", this);} // tgen
ccc::FF4x13y8 ::FF4x13y8(){ note_ctor("_ZN3ccc8FF4x13y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y8E, buf);
    ::ccc::FF4x13y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y8E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y8E);
    dp->::ccc::FF4x13y8::~FF4x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y8E(Test__ZN3ccc8FF4x13y8E, "_ZN3ccc8FF4x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y8C1Ev();
extern void _ZN3ccc8FF4x13y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y8E[] = {
  NSPAIR(_ZN3ccc8FF4x13y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x13y83abcEv();
extern void _ZN3ccc8FF4x13y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y8E[] = {
  {&(_ZTVN3ccc8FF4x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y8E[];
static VTBL_ENTRY alt_thunk_names1177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y8E = {  "_ZN3ccc8FF4x13y8E", // class name
  bases__ZN3ccc8FF4x13y8E, 2,
  &(vtc__ZN3ccc8FF4x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y9  : virtual ::ccc::EE4x13 {
  virtual void  efg(); // _ZN3ccc8FF4x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x13y93pqrEv
  ~FF4x13y9(); // tgen
  FF4x13y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x13y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x13y93efgEv");}
void  ccc::FF4x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x13y93pqrEv");}
ccc::FF4x13y9 ::~FF4x13y9(){ note_dtor("_ZN3ccc8FF4x13y9E", this);} // tgen
ccc::FF4x13y9 ::FF4x13y9(){ note_ctor("_ZN3ccc8FF4x13y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x13y9E, buf);
    ::ccc::FF4x13y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x13y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y9E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc8FF4x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x13y9E);
    dp->::ccc::FF4x13y9::~FF4x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x13y9E(Test__ZN3ccc8FF4x13y9E, "_ZN3ccc8FF4x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x13y9C1Ev();
extern void _ZN3ccc8FF4x13y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x13y9E[] = {
  NSPAIR(_ZN3ccc8FF4x13y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc8FF4x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y9E[];
extern void _ZN3ccc8FF4x13y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x13y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x13y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x13y9E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x13y9E[] = {
  {&(_ZTVN3ccc8FF4x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x13y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_8FF4x13y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x13y9E[];
static VTBL_ENTRY alt_thunk_names1178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x13y9E = {  "_ZN3ccc8FF4x13y9E", // class name
  bases__ZN3ccc8FF4x13y9E, 2,
  &(vtc__ZN3ccc8FF4x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x13y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x13y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x13y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x13y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y10  : virtual ::ccc::EE4x13 {
  virtual void  pqr(); // _ZN3ccc9FF4x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x13y103abcEv
  ~FF4x13y10(); // tgen
  FF4x13y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x13y103pqrEv");}
void  ccc::FF4x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x13y103abcEv");}
ccc::FF4x13y10 ::~FF4x13y10(){ note_dtor("_ZN3ccc9FF4x13y10E", this);} // tgen
ccc::FF4x13y10 ::FF4x13y10(){ note_ctor("_ZN3ccc9FF4x13y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y10E, buf);
    ::ccc::FF4x13y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y10E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y10E);
    dp->::ccc::FF4x13y10::~FF4x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y10E(Test__ZN3ccc9FF4x13y10E, "_ZN3ccc9FF4x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y10C1Ev();
extern void _ZN3ccc9FF4x13y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y10E[] = {
  NSPAIR(_ZN3ccc9FF4x13y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y10E[];
extern void _ZN3ccc9FF4x13y103pqrEv();
extern void _ZN3ccc9FF4x13y103abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y103abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y10E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y10E[] = {
  {&(_ZTVN3ccc9FF4x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y10E[];
static VTBL_ENTRY alt_thunk_names1179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y10E = {  "_ZN3ccc9FF4x13y10E", // class name
  bases__ZN3ccc9FF4x13y10E, 2,
  &(vtc__ZN3ccc9FF4x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y11  : virtual ::ccc::EE4x13 {
  virtual void  pqr(); // _ZN3ccc9FF4x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x13y113efgEv
  ~FF4x13y11(); // tgen
  FF4x13y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x13y113pqrEv");}
void  ccc::FF4x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x13y113efgEv");}
ccc::FF4x13y11 ::~FF4x13y11(){ note_dtor("_ZN3ccc9FF4x13y11E", this);} // tgen
ccc::FF4x13y11 ::FF4x13y11(){ note_ctor("_ZN3ccc9FF4x13y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y11E, buf);
    ::ccc::FF4x13y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y11E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y11E);
    dp->::ccc::FF4x13y11::~FF4x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y11E(Test__ZN3ccc9FF4x13y11E, "_ZN3ccc9FF4x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y11C1Ev();
extern void _ZN3ccc9FF4x13y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y11E[] = {
  NSPAIR(_ZN3ccc9FF4x13y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y11E[];
extern void _ZN3ccc9FF4x13y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x13y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y11E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y11E[] = {
  {&(_ZTVN3ccc9FF4x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y11E[];
static VTBL_ENTRY alt_thunk_names1180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y11E = {  "_ZN3ccc9FF4x13y11E", // class name
  bases__ZN3ccc9FF4x13y11E, 2,
  &(vtc__ZN3ccc9FF4x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y12  : virtual ::ccc::EE4x13 {
  virtual void  abc(); // _ZN3ccc9FF4x13y123abcEv
  ~FF4x13y12(); // tgen
  FF4x13y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y12E) C1{ VBC2{ VBC3{ v3 v1 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF4x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x13y123abcEv");}
ccc::FF4x13y12 ::~FF4x13y12(){ note_dtor("_ZN3ccc9FF4x13y12E", this);} // tgen
ccc::FF4x13y12 ::FF4x13y12(){ note_ctor("_ZN3ccc9FF4x13y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y12E, buf);
    ::ccc::FF4x13y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y12E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y12E);
    dp->::ccc::FF4x13y12::~FF4x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y12E(Test__ZN3ccc9FF4x13y12E, "_ZN3ccc9FF4x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y12C1Ev();
extern void _ZN3ccc9FF4x13y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y12E[] = {
  NSPAIR(_ZN3ccc9FF4x13y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9FF4x13y123abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y123abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y12E[] = {
  {&(_ZTVN3ccc9FF4x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y12E[];
static VTBL_ENTRY alt_thunk_names1181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y12E = {  "_ZN3ccc9FF4x13y12E", // class name
  bases__ZN3ccc9FF4x13y12E, 2,
  &(vtc__ZN3ccc9FF4x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y13  : virtual ::ccc::EE4x13 {
  virtual void  efg(); // _ZN3ccc9FF4x13y133efgEv
  ~FF4x13y13(); // tgen
  FF4x13y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v1} v1}
}
namespace ccc { 
void  ccc::FF4x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x13y133efgEv");}
ccc::FF4x13y13 ::~FF4x13y13(){ note_dtor("_ZN3ccc9FF4x13y13E", this);} // tgen
ccc::FF4x13y13 ::FF4x13y13(){ note_ctor("_ZN3ccc9FF4x13y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y13E, buf);
    ::ccc::FF4x13y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y13E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y13E);
    dp->::ccc::FF4x13y13::~FF4x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y13E(Test__ZN3ccc9FF4x13y13E, "_ZN3ccc9FF4x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y13C1Ev();
extern void _ZN3ccc9FF4x13y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y13E[] = {
  NSPAIR(_ZN3ccc9FF4x13y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x13y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y13E[] = {
  {&(_ZTVN3ccc9FF4x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y13E[];
static VTBL_ENTRY alt_thunk_names1182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y13E = {  "_ZN3ccc9FF4x13y13E", // class name
  bases__ZN3ccc9FF4x13y13E, 2,
  &(vtc__ZN3ccc9FF4x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y14  : virtual ::ccc::EE4x13 {
  virtual void  pqr(); // _ZN3ccc9FF4x13y143pqrEv
  ~FF4x13y14(); // tgen
  FF4x13y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y14E) C1{ VBC2{ VBC3{ v1 v3 v2} v2} v1}
}
namespace ccc { 
void  ccc::FF4x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x13y143pqrEv");}
ccc::FF4x13y14 ::~FF4x13y14(){ note_dtor("_ZN3ccc9FF4x13y14E", this);} // tgen
ccc::FF4x13y14 ::FF4x13y14(){ note_ctor("_ZN3ccc9FF4x13y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y14E, buf);
    ::ccc::FF4x13y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y14E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y14E);
    dp->::ccc::FF4x13y14::~FF4x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y14E(Test__ZN3ccc9FF4x13y14E, "_ZN3ccc9FF4x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y14C1Ev();
extern void _ZN3ccc9FF4x13y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y14E[] = {
  NSPAIR(_ZN3ccc9FF4x13y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y14E[];
extern void _ZN3ccc9FF4x13y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y14E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y14E[] = {
  {&(_ZTVN3ccc9FF4x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y14E[];
static VTBL_ENTRY alt_thunk_names1183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y14E = {  "_ZN3ccc9FF4x13y14E", // class name
  bases__ZN3ccc9FF4x13y14E, 2,
  &(vtc__ZN3ccc9FF4x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x13y15  : virtual ::ccc::EE4x13 {
  ~FF4x13y15(); // tgen
  FF4x13y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x13y15E) C1{ VBC2{ VBC3{ v2 v3 v1} v1}}
}
namespace ccc { 
ccc::FF4x13y15 ::~FF4x13y15(){ note_dtor("_ZN3ccc9FF4x13y15E", this);} // tgen
ccc::FF4x13y15 ::FF4x13y15(){ note_ctor("_ZN3ccc9FF4x13y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x13y15E, buf);
    ::ccc::FF4x13y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x13y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y15E");
    check_base_class_offset(lv, (::ccc::EE4x13*), 0, "_ZN3ccc9FF4x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x13y15E);
    dp->::ccc::FF4x13y15::~FF4x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x13y15E(Test__ZN3ccc9FF4x13y15E, "_ZN3ccc9FF4x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x13y15C1Ev();
extern void _ZN3ccc9FF4x13y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x13y15E[] = {
  NSPAIR(_ZN3ccc9FF4x13y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x13E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x13E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x13E[];
static Base_Class bases__ZN3ccc9FF4x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9FF4x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x13y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv)();
extern void _ZN3ccc6EE4x133efgEv() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv),
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x13y15E[] = {
  {&(_ZTVN3ccc9FF4x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x13y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x13E__NS_9FF4x13y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x13y15E[];
static VTBL_ENTRY alt_thunk_names1184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc6EE4x133efgEv,_ZTv0_n20_N3ccc6EE4x133efgEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x133efgEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x13y15E = {  "_ZN3ccc9FF4x13y15E", // class name
  bases__ZN3ccc9FF4x13y15E, 2,
  &(vtc__ZN3ccc9FF4x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x13y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x13y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x13y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x13y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y0  : virtual ::ccc::EE4x14 {
  virtual void  abc(); // _ZN3ccc8FF4x14y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y03pqrEv
  ~FF4x14y0(); // tgen
  FF4x14y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y0E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y03abcEv");}
void  ccc::FF4x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y03efgEv");}
void  ccc::FF4x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y03pqrEv");}
ccc::FF4x14y0 ::~FF4x14y0(){ note_dtor("_ZN3ccc8FF4x14y0E", this);} // tgen
ccc::FF4x14y0 ::FF4x14y0(){ note_ctor("_ZN3ccc8FF4x14y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y0E, buf);
    ::ccc::FF4x14y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y0E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y0E);
    dp->::ccc::FF4x14y0::~FF4x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y0E(Test__ZN3ccc8FF4x14y0E, "_ZN3ccc8FF4x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y0C1Ev();
extern void _ZN3ccc8FF4x14y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y0E[] = {
  NSPAIR(_ZN3ccc8FF4x14y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y0E[];
extern void _ZN3ccc8FF4x14y03pqrEv();
extern void _ZN3ccc8FF4x14y03abcEv();
extern void _ZN3ccc8FF4x14y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y0E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y0E[] = {
  {&(_ZTVN3ccc8FF4x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y0E[];
static VTBL_ENTRY alt_thunk_names1185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y0E = {  "_ZN3ccc8FF4x14y0E", // class name
  bases__ZN3ccc8FF4x14y0E, 2,
  &(vtc__ZN3ccc8FF4x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y0E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y1  : virtual ::ccc::EE4x14 {
  virtual void  abc(); // _ZN3ccc8FF4x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x14y13efgEv
  ~FF4x14y1(); // tgen
  FF4x14y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y1E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y13abcEv");}
void  ccc::FF4x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y13pqrEv");}
void  ccc::FF4x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y13efgEv");}
ccc::FF4x14y1 ::~FF4x14y1(){ note_dtor("_ZN3ccc8FF4x14y1E", this);} // tgen
ccc::FF4x14y1 ::FF4x14y1(){ note_ctor("_ZN3ccc8FF4x14y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y1E, buf);
    ::ccc::FF4x14y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y1E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y1E);
    dp->::ccc::FF4x14y1::~FF4x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y1E(Test__ZN3ccc8FF4x14y1E, "_ZN3ccc8FF4x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y1C1Ev();
extern void _ZN3ccc8FF4x14y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y1E[] = {
  NSPAIR(_ZN3ccc8FF4x14y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y1E[];
extern void _ZN3ccc8FF4x14y13pqrEv();
extern void _ZN3ccc8FF4x14y13abcEv();
extern void _ZN3ccc8FF4x14y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y1E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y1E[] = {
  {&(_ZTVN3ccc8FF4x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y1E[];
static VTBL_ENTRY alt_thunk_names1186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y1E = {  "_ZN3ccc8FF4x14y1E", // class name
  bases__ZN3ccc8FF4x14y1E, 2,
  &(vtc__ZN3ccc8FF4x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y1E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y2  : virtual ::ccc::EE4x14 {
  virtual void  efg(); // _ZN3ccc8FF4x14y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y23pqrEv
  ~FF4x14y2(); // tgen
  FF4x14y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y2E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y23efgEv");}
void  ccc::FF4x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y23abcEv");}
void  ccc::FF4x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y23pqrEv");}
ccc::FF4x14y2 ::~FF4x14y2(){ note_dtor("_ZN3ccc8FF4x14y2E", this);} // tgen
ccc::FF4x14y2 ::FF4x14y2(){ note_ctor("_ZN3ccc8FF4x14y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y2E, buf);
    ::ccc::FF4x14y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y2E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y2E);
    dp->::ccc::FF4x14y2::~FF4x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y2E(Test__ZN3ccc8FF4x14y2E, "_ZN3ccc8FF4x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y2C1Ev();
extern void _ZN3ccc8FF4x14y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y2E[] = {
  NSPAIR(_ZN3ccc8FF4x14y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y2E[];
extern void _ZN3ccc8FF4x14y23pqrEv();
extern void _ZN3ccc8FF4x14y23abcEv();
extern void _ZN3ccc8FF4x14y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y2E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y2E[] = {
  {&(_ZTVN3ccc8FF4x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y2E[];
static VTBL_ENTRY alt_thunk_names1187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y2E = {  "_ZN3ccc8FF4x14y2E", // class name
  bases__ZN3ccc8FF4x14y2E, 2,
  &(vtc__ZN3ccc8FF4x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y2E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y3  : virtual ::ccc::EE4x14 {
  virtual void  efg(); // _ZN3ccc8FF4x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x14y33abcEv
  ~FF4x14y3(); // tgen
  FF4x14y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y3E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y33efgEv");}
void  ccc::FF4x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y33pqrEv");}
void  ccc::FF4x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y33abcEv");}
ccc::FF4x14y3 ::~FF4x14y3(){ note_dtor("_ZN3ccc8FF4x14y3E", this);} // tgen
ccc::FF4x14y3 ::FF4x14y3(){ note_ctor("_ZN3ccc8FF4x14y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y3E, buf);
    ::ccc::FF4x14y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y3E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y3E);
    dp->::ccc::FF4x14y3::~FF4x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y3E(Test__ZN3ccc8FF4x14y3E, "_ZN3ccc8FF4x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y3C1Ev();
extern void _ZN3ccc8FF4x14y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y3E[] = {
  NSPAIR(_ZN3ccc8FF4x14y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y3E[];
extern void _ZN3ccc8FF4x14y33pqrEv();
extern void _ZN3ccc8FF4x14y33abcEv();
extern void _ZN3ccc8FF4x14y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y3E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y3E[] = {
  {&(_ZTVN3ccc8FF4x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y3E[];
static VTBL_ENTRY alt_thunk_names1188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y3E = {  "_ZN3ccc8FF4x14y3E", // class name
  bases__ZN3ccc8FF4x14y3E, 2,
  &(vtc__ZN3ccc8FF4x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y3E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y4  : virtual ::ccc::EE4x14 {
  virtual void  pqr(); // _ZN3ccc8FF4x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x14y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x14y43efgEv
  ~FF4x14y4(); // tgen
  FF4x14y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y4E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y43pqrEv");}
void  ccc::FF4x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y43abcEv");}
void  ccc::FF4x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y43efgEv");}
ccc::FF4x14y4 ::~FF4x14y4(){ note_dtor("_ZN3ccc8FF4x14y4E", this);} // tgen
ccc::FF4x14y4 ::FF4x14y4(){ note_ctor("_ZN3ccc8FF4x14y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y4E, buf);
    ::ccc::FF4x14y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y4E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y4E);
    dp->::ccc::FF4x14y4::~FF4x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y4E(Test__ZN3ccc8FF4x14y4E, "_ZN3ccc8FF4x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y4C1Ev();
extern void _ZN3ccc8FF4x14y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y4E[] = {
  NSPAIR(_ZN3ccc8FF4x14y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y4E[];
extern void _ZN3ccc8FF4x14y43pqrEv();
extern void _ZN3ccc8FF4x14y43abcEv();
extern void _ZN3ccc8FF4x14y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y4E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y4E[] = {
  {&(_ZTVN3ccc8FF4x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y4E[];
static VTBL_ENTRY alt_thunk_names1189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y4E = {  "_ZN3ccc8FF4x14y4E", // class name
  bases__ZN3ccc8FF4x14y4E, 2,
  &(vtc__ZN3ccc8FF4x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y4E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y5  : virtual ::ccc::EE4x14 {
  virtual void  pqr(); // _ZN3ccc8FF4x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x14y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x14y53abcEv
  ~FF4x14y5(); // tgen
  FF4x14y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y5E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y53pqrEv");}
void  ccc::FF4x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y53efgEv");}
void  ccc::FF4x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y53abcEv");}
ccc::FF4x14y5 ::~FF4x14y5(){ note_dtor("_ZN3ccc8FF4x14y5E", this);} // tgen
ccc::FF4x14y5 ::FF4x14y5(){ note_ctor("_ZN3ccc8FF4x14y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y5E, buf);
    ::ccc::FF4x14y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y5E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y5E);
    dp->::ccc::FF4x14y5::~FF4x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y5E(Test__ZN3ccc8FF4x14y5E, "_ZN3ccc8FF4x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y5C1Ev();
extern void _ZN3ccc8FF4x14y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y5E[] = {
  NSPAIR(_ZN3ccc8FF4x14y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y5E[];
extern void _ZN3ccc8FF4x14y53pqrEv();
extern void _ZN3ccc8FF4x14y53abcEv();
extern void _ZN3ccc8FF4x14y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y5E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y5E[] = {
  {&(_ZTVN3ccc8FF4x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y5E[];
static VTBL_ENTRY alt_thunk_names1190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y5E = {  "_ZN3ccc8FF4x14y5E", // class name
  bases__ZN3ccc8FF4x14y5E, 2,
  &(vtc__ZN3ccc8FF4x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y5E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y6  : virtual ::ccc::EE4x14 {
  virtual void  abc(); // _ZN3ccc8FF4x14y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x14y63efgEv
  ~FF4x14y6(); // tgen
  FF4x14y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y6E) C1{ VBC2{ VBC3{ v3 v1 v2} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y63abcEv");}
void  ccc::FF4x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y63efgEv");}
ccc::FF4x14y6 ::~FF4x14y6(){ note_dtor("_ZN3ccc8FF4x14y6E", this);} // tgen
ccc::FF4x14y6 ::FF4x14y6(){ note_ctor("_ZN3ccc8FF4x14y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y6E, buf);
    ::ccc::FF4x14y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y6E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y6E);
    dp->::ccc::FF4x14y6::~FF4x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y6E(Test__ZN3ccc8FF4x14y6E, "_ZN3ccc8FF4x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y6C1Ev();
extern void _ZN3ccc8FF4x14y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y6E[] = {
  NSPAIR(_ZN3ccc8FF4x14y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x14y63abcEv();
extern void _ZN3ccc8FF4x14y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y6E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y6E[] = {
  {&(_ZTVN3ccc8FF4x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y6E[];
static VTBL_ENTRY alt_thunk_names1191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y6E = {  "_ZN3ccc8FF4x14y6E", // class name
  bases__ZN3ccc8FF4x14y6E, 2,
  &(vtc__ZN3ccc8FF4x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y6E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y7  : virtual ::ccc::EE4x14 {
  virtual void  abc(); // _ZN3ccc8FF4x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y73pqrEv
  ~FF4x14y7(); // tgen
  FF4x14y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y7E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y73abcEv");}
void  ccc::FF4x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y73pqrEv");}
ccc::FF4x14y7 ::~FF4x14y7(){ note_dtor("_ZN3ccc8FF4x14y7E", this);} // tgen
ccc::FF4x14y7 ::FF4x14y7(){ note_ctor("_ZN3ccc8FF4x14y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y7E, buf);
    ::ccc::FF4x14y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y7E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y7E);
    dp->::ccc::FF4x14y7::~FF4x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y7E(Test__ZN3ccc8FF4x14y7E, "_ZN3ccc8FF4x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y7C1Ev();
extern void _ZN3ccc8FF4x14y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y7E[] = {
  NSPAIR(_ZN3ccc8FF4x14y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y7E[];
extern void _ZN3ccc8FF4x14y73pqrEv();
extern void _ZN3ccc8FF4x14y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y7E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y7E[] = {
  {&(_ZTVN3ccc8FF4x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y7E[];
static VTBL_ENTRY alt_thunk_names1192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y7E = {  "_ZN3ccc8FF4x14y7E", // class name
  bases__ZN3ccc8FF4x14y7E, 2,
  &(vtc__ZN3ccc8FF4x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y7E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y8  : virtual ::ccc::EE4x14 {
  virtual void  efg(); // _ZN3ccc8FF4x14y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x14y83abcEv
  ~FF4x14y8(); // tgen
  FF4x14y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y8E) C1{ VBC2{ VBC3{ v3 v2 v1} v3} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y83efgEv");}
void  ccc::FF4x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x14y83abcEv");}
ccc::FF4x14y8 ::~FF4x14y8(){ note_dtor("_ZN3ccc8FF4x14y8E", this);} // tgen
ccc::FF4x14y8 ::FF4x14y8(){ note_ctor("_ZN3ccc8FF4x14y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y8E, buf);
    ::ccc::FF4x14y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y8E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y8E);
    dp->::ccc::FF4x14y8::~FF4x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y8E(Test__ZN3ccc8FF4x14y8E, "_ZN3ccc8FF4x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y8C1Ev();
extern void _ZN3ccc8FF4x14y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y8E[] = {
  NSPAIR(_ZN3ccc8FF4x14y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc8FF4x14y83abcEv();
extern void _ZN3ccc8FF4x14y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y8E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y8E[] = {
  {&(_ZTVN3ccc8FF4x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y8E[];
static VTBL_ENTRY alt_thunk_names1193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y8E = {  "_ZN3ccc8FF4x14y8E", // class name
  bases__ZN3ccc8FF4x14y8E, 2,
  &(vtc__ZN3ccc8FF4x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y8E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y9  : virtual ::ccc::EE4x14 {
  virtual void  efg(); // _ZN3ccc8FF4x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x14y93pqrEv
  ~FF4x14y9(); // tgen
  FF4x14y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x14y9E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x14y93efgEv");}
void  ccc::FF4x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x14y93pqrEv");}
ccc::FF4x14y9 ::~FF4x14y9(){ note_dtor("_ZN3ccc8FF4x14y9E", this);} // tgen
ccc::FF4x14y9 ::FF4x14y9(){ note_ctor("_ZN3ccc8FF4x14y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x14y9E, buf);
    ::ccc::FF4x14y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x14y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y9E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc8FF4x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x14y9E);
    dp->::ccc::FF4x14y9::~FF4x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x14y9E(Test__ZN3ccc8FF4x14y9E, "_ZN3ccc8FF4x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x14y9C1Ev();
extern void _ZN3ccc8FF4x14y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x14y9E[] = {
  NSPAIR(_ZN3ccc8FF4x14y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc8FF4x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y9E[];
extern void _ZN3ccc8FF4x14y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x14y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x14y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x14y9E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x14y9E[] = {
  {&(_ZTVN3ccc8FF4x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x14y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_8FF4x14y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x14y9E[];
static VTBL_ENTRY alt_thunk_names1194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8FF4x14y9E = {  "_ZN3ccc8FF4x14y9E", // class name
  bases__ZN3ccc8FF4x14y9E, 2,
  &(vtc__ZN3ccc8FF4x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x14y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x14y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x14y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x14y9E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y10  : virtual ::ccc::EE4x14 {
  virtual void  pqr(); // _ZN3ccc9FF4x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x14y103abcEv
  ~FF4x14y10(); // tgen
  FF4x14y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y10E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x14y103pqrEv");}
void  ccc::FF4x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x14y103abcEv");}
ccc::FF4x14y10 ::~FF4x14y10(){ note_dtor("_ZN3ccc9FF4x14y10E", this);} // tgen
ccc::FF4x14y10 ::FF4x14y10(){ note_ctor("_ZN3ccc9FF4x14y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y10E, buf);
    ::ccc::FF4x14y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y10E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y10E);
    dp->::ccc::FF4x14y10::~FF4x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y10E(Test__ZN3ccc9FF4x14y10E, "_ZN3ccc9FF4x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y10C1Ev();
extern void _ZN3ccc9FF4x14y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y10E[] = {
  NSPAIR(_ZN3ccc9FF4x14y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y10E[];
extern void _ZN3ccc9FF4x14y103pqrEv();
extern void _ZN3ccc9FF4x14y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y10E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y10E[] = {
  {&(_ZTVN3ccc9FF4x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y10E[];
static VTBL_ENTRY alt_thunk_names1195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y10E = {  "_ZN3ccc9FF4x14y10E", // class name
  bases__ZN3ccc9FF4x14y10E, 2,
  &(vtc__ZN3ccc9FF4x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y10E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y11  : virtual ::ccc::EE4x14 {
  virtual void  pqr(); // _ZN3ccc9FF4x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x14y113efgEv
  ~FF4x14y11(); // tgen
  FF4x14y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y11E) C1{ VBC2{ VBC3{ v1 v3 v2} v1} v1 v2}
}
namespace ccc { 
void  ccc::FF4x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x14y113pqrEv");}
void  ccc::FF4x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x14y113efgEv");}
ccc::FF4x14y11 ::~FF4x14y11(){ note_dtor("_ZN3ccc9FF4x14y11E", this);} // tgen
ccc::FF4x14y11 ::FF4x14y11(){ note_ctor("_ZN3ccc9FF4x14y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y11E, buf);
    ::ccc::FF4x14y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y11E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y11E);
    dp->::ccc::FF4x14y11::~FF4x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y11E(Test__ZN3ccc9FF4x14y11E, "_ZN3ccc9FF4x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y11C1Ev();
extern void _ZN3ccc9FF4x14y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y11E[] = {
  NSPAIR(_ZN3ccc9FF4x14y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y11E[];
extern void _ZN3ccc9FF4x14y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x14y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y11E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y11E[] = {
  {&(_ZTVN3ccc9FF4x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y11E[];
static VTBL_ENTRY alt_thunk_names1196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y11E = {  "_ZN3ccc9FF4x14y11E", // class name
  bases__ZN3ccc9FF4x14y11E, 2,
  &(vtc__ZN3ccc9FF4x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y11E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y12  : virtual ::ccc::EE4x14 {
  virtual void  abc(); // _ZN3ccc9FF4x14y123abcEv
  ~FF4x14y12(); // tgen
  FF4x14y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y12E) C1{ VBC2{ VBC3{ v2 v1 v3} v2} v1}
}
namespace ccc { 
void  ccc::FF4x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x14y123abcEv");}
ccc::FF4x14y12 ::~FF4x14y12(){ note_dtor("_ZN3ccc9FF4x14y12E", this);} // tgen
ccc::FF4x14y12 ::FF4x14y12(){ note_ctor("_ZN3ccc9FF4x14y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y12E, buf);
    ::ccc::FF4x14y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y12E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y12E);
    dp->::ccc::FF4x14y12::~FF4x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y12E(Test__ZN3ccc9FF4x14y12E, "_ZN3ccc9FF4x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y12C1Ev();
extern void _ZN3ccc9FF4x14y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y12E[] = {
  NSPAIR(_ZN3ccc9FF4x14y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc9FF4x14y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y12E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y12E[] = {
  {&(_ZTVN3ccc9FF4x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y12E[];
static VTBL_ENTRY alt_thunk_names1197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y12E = {  "_ZN3ccc9FF4x14y12E", // class name
  bases__ZN3ccc9FF4x14y12E, 2,
  &(vtc__ZN3ccc9FF4x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y12E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y13  : virtual ::ccc::EE4x14 {
  virtual void  efg(); // _ZN3ccc9FF4x14y133efgEv
  ~FF4x14y13(); // tgen
  FF4x14y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y13E) C1{ VBC2{ VBC3{ v2 v3 v1} v2} v1}
}
namespace ccc { 
void  ccc::FF4x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x14y133efgEv");}
ccc::FF4x14y13 ::~FF4x14y13(){ note_dtor("_ZN3ccc9FF4x14y13E", this);} // tgen
ccc::FF4x14y13 ::FF4x14y13(){ note_ctor("_ZN3ccc9FF4x14y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y13E, buf);
    ::ccc::FF4x14y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y13E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y13E);
    dp->::ccc::FF4x14y13::~FF4x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y13E(Test__ZN3ccc9FF4x14y13E, "_ZN3ccc9FF4x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y13C1Ev();
extern void _ZN3ccc9FF4x14y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y13E[] = {
  NSPAIR(_ZN3ccc9FF4x14y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x14y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y13E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y13E[] = {
  {&(_ZTVN3ccc9FF4x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y13E[];
static VTBL_ENTRY alt_thunk_names1198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y13E = {  "_ZN3ccc9FF4x14y13E", // class name
  bases__ZN3ccc9FF4x14y13E, 2,
  &(vtc__ZN3ccc9FF4x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y13E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y14  : virtual ::ccc::EE4x14 {
  virtual void  pqr(); // _ZN3ccc9FF4x14y143pqrEv
  ~FF4x14y14(); // tgen
  FF4x14y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y14E) C1{ VBC2{ VBC3{ v1 v2 v3} v1} v1}
}
namespace ccc { 
void  ccc::FF4x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x14y143pqrEv");}
ccc::FF4x14y14 ::~FF4x14y14(){ note_dtor("_ZN3ccc9FF4x14y14E", this);} // tgen
ccc::FF4x14y14 ::FF4x14y14(){ note_ctor("_ZN3ccc9FF4x14y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y14E, buf);
    ::ccc::FF4x14y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y14E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y14E);
    dp->::ccc::FF4x14y14::~FF4x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y14E(Test__ZN3ccc9FF4x14y14E, "_ZN3ccc9FF4x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y14C1Ev();
extern void _ZN3ccc9FF4x14y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y14E[] = {
  NSPAIR(_ZN3ccc9FF4x14y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y14E[];
extern void _ZN3ccc9FF4x14y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y14E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y14E[] = {
  {&(_ZTVN3ccc9FF4x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y14E[];
static VTBL_ENTRY alt_thunk_names1199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y14E = {  "_ZN3ccc9FF4x14y14E", // class name
  bases__ZN3ccc9FF4x14y14E, 2,
  &(vtc__ZN3ccc9FF4x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y14E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x14y15  : virtual ::ccc::EE4x14 {
  ~FF4x14y15(); // tgen
  FF4x14y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x14y15E) C1{ VBC2{ VBC3{ v1 v2 v3} v1}}
}
namespace ccc { 
ccc::FF4x14y15 ::~FF4x14y15(){ note_dtor("_ZN3ccc9FF4x14y15E", this);} // tgen
ccc::FF4x14y15 ::FF4x14y15(){ note_ctor("_ZN3ccc9FF4x14y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x14y15E, buf);
    ::ccc::FF4x14y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x14y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y15E");
    check_base_class_offset(lv, (::ccc::EE4x14*), 0, "_ZN3ccc9FF4x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x14y15E);
    dp->::ccc::FF4x14y15::~FF4x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x14y15E(Test__ZN3ccc9FF4x14y15E, "_ZN3ccc9FF4x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x14y15C1Ev();
extern void _ZN3ccc9FF4x14y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x14y15E[] = {
  NSPAIR(_ZN3ccc9FF4x14y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x14E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x14E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x14E[];
static Base_Class bases__ZN3ccc9FF4x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x14y15E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x14y15E[];
extern void ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv)();
extern void _ZN3ccc6EE4x143pqrEv() __attribute__((weak));
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x14y15E[] = {
  {&(_ZTVN3ccc9FF4x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x14y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x14E__NS_9FF4x14y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x14y15E[];
static VTBL_ENTRY alt_thunk_names1200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc6EE4x143pqrEv,_ZTv0_n12_N3ccc6EE4x143pqrEv), // 
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  (VTBL_ENTRY)_ZN3ccc6EE4x143pqrEv,
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9FF4x14y15E = {  "_ZN3ccc9FF4x14y15E", // class name
  bases__ZN3ccc9FF4x14y15E, 2,
  &(vtc__ZN3ccc9FF4x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x14y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x14y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x14y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x14y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  FF4x15y0  : virtual ::ccc::EE4x15 {
  virtual void  abc(); // _ZN3ccc8FF4x15y03abcEv
  virtual void  efg(); // _ZN3ccc8FF4x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y03pqrEv
  ~FF4x15y0(); // tgen
  FF4x15y0(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y0E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y03abcEv");}
void  ccc::FF4x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y03efgEv");}
void  ccc::FF4x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y03pqrEv");}
ccc::FF4x15y0 ::~FF4x15y0(){ note_dtor("_ZN3ccc8FF4x15y0E", this);} // tgen
ccc::FF4x15y0 ::FF4x15y0(){ note_ctor("_ZN3ccc8FF4x15y0E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y0E, buf);
    ::ccc::FF4x15y0 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y0E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y0E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y0E);
    dp->::ccc::FF4x15y0::~FF4x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y0E(Test__ZN3ccc8FF4x15y0E, "_ZN3ccc8FF4x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y0C1Ev();
extern void _ZN3ccc8FF4x15y0D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y0E[] = {
  NSPAIR(_ZN3ccc8FF4x15y0C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y0E[];
extern void _ZN3ccc8FF4x15y03pqrEv();
extern void _ZN3ccc8FF4x15y03abcEv();
extern void _ZN3ccc8FF4x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y0E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y0E[] = {
  {&(_ZTVN3ccc8FF4x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y0E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y0E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y0E[];
Class_Descriptor cd__ZN3ccc8FF4x15y0E = {  "_ZN3ccc8FF4x15y0E", // class name
  bases__ZN3ccc8FF4x15y0E, 2,
  &(vtc__ZN3ccc8FF4x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y0E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y0E),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
namespace ccc { 
struct  FF4x15y1  : virtual ::ccc::EE4x15 {
  virtual void  abc(); // _ZN3ccc8FF4x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x15y13efgEv
  ~FF4x15y1(); // tgen
  FF4x15y1(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y1E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y13abcEv");}
void  ccc::FF4x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y13pqrEv");}
void  ccc::FF4x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y13efgEv");}
ccc::FF4x15y1 ::~FF4x15y1(){ note_dtor("_ZN3ccc8FF4x15y1E", this);} // tgen
ccc::FF4x15y1 ::FF4x15y1(){ note_ctor("_ZN3ccc8FF4x15y1E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y1E, buf);
    ::ccc::FF4x15y1 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y1E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y1E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y1E);
    dp->::ccc::FF4x15y1::~FF4x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y1E(Test__ZN3ccc8FF4x15y1E, "_ZN3ccc8FF4x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y1C1Ev();
extern void _ZN3ccc8FF4x15y1D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y1E[] = {
  NSPAIR(_ZN3ccc8FF4x15y1C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y1E[];
extern void _ZN3ccc8FF4x15y13pqrEv();
extern void _ZN3ccc8FF4x15y13abcEv();
extern void _ZN3ccc8FF4x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y1E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y1E[] = {
  {&(_ZTVN3ccc8FF4x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y1E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y1E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y1E[];
Class_Descriptor cd__ZN3ccc8FF4x15y1E = {  "_ZN3ccc8FF4x15y1E", // class name
  bases__ZN3ccc8FF4x15y1E, 2,
  &(vtc__ZN3ccc8FF4x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y1E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y1E),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
namespace ccc { 
struct  FF4x15y2  : virtual ::ccc::EE4x15 {
  virtual void  efg(); // _ZN3ccc8FF4x15y23efgEv
  virtual void  abc(); // _ZN3ccc8FF4x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y23pqrEv
  ~FF4x15y2(); // tgen
  FF4x15y2(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y2E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y23efgEv");}
void  ccc::FF4x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y23abcEv");}
void  ccc::FF4x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y23pqrEv");}
ccc::FF4x15y2 ::~FF4x15y2(){ note_dtor("_ZN3ccc8FF4x15y2E", this);} // tgen
ccc::FF4x15y2 ::FF4x15y2(){ note_ctor("_ZN3ccc8FF4x15y2E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y2E, buf);
    ::ccc::FF4x15y2 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y2E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y2E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y2E);
    dp->::ccc::FF4x15y2::~FF4x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y2E(Test__ZN3ccc8FF4x15y2E, "_ZN3ccc8FF4x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y2C1Ev();
extern void _ZN3ccc8FF4x15y2D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y2E[] = {
  NSPAIR(_ZN3ccc8FF4x15y2C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y2E[];
extern void _ZN3ccc8FF4x15y23pqrEv();
extern void _ZN3ccc8FF4x15y23abcEv();
extern void _ZN3ccc8FF4x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y2E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y2E[] = {
  {&(_ZTVN3ccc8FF4x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y2E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y2E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y2E[];
Class_Descriptor cd__ZN3ccc8FF4x15y2E = {  "_ZN3ccc8FF4x15y2E", // class name
  bases__ZN3ccc8FF4x15y2E, 2,
  &(vtc__ZN3ccc8FF4x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y2E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y2E),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
namespace ccc { 
struct  FF4x15y3  : virtual ::ccc::EE4x15 {
  virtual void  efg(); // _ZN3ccc8FF4x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x15y33abcEv
  ~FF4x15y3(); // tgen
  FF4x15y3(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y3E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y33efgEv");}
void  ccc::FF4x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y33pqrEv");}
void  ccc::FF4x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y33abcEv");}
ccc::FF4x15y3 ::~FF4x15y3(){ note_dtor("_ZN3ccc8FF4x15y3E", this);} // tgen
ccc::FF4x15y3 ::FF4x15y3(){ note_ctor("_ZN3ccc8FF4x15y3E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y3E, buf);
    ::ccc::FF4x15y3 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y3E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y3E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y3E);
    dp->::ccc::FF4x15y3::~FF4x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y3E(Test__ZN3ccc8FF4x15y3E, "_ZN3ccc8FF4x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y3C1Ev();
extern void _ZN3ccc8FF4x15y3D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y3E[] = {
  NSPAIR(_ZN3ccc8FF4x15y3C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y3E[];
extern void _ZN3ccc8FF4x15y33pqrEv();
extern void _ZN3ccc8FF4x15y33abcEv();
extern void _ZN3ccc8FF4x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y3E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y3E[] = {
  {&(_ZTVN3ccc8FF4x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y3E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y3E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y3E[];
Class_Descriptor cd__ZN3ccc8FF4x15y3E = {  "_ZN3ccc8FF4x15y3E", // class name
  bases__ZN3ccc8FF4x15y3E, 2,
  &(vtc__ZN3ccc8FF4x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y3E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y3E),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
namespace ccc { 
struct  FF4x15y4  : virtual ::ccc::EE4x15 {
  virtual void  pqr(); // _ZN3ccc8FF4x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8FF4x15y43abcEv
  virtual void  efg(); // _ZN3ccc8FF4x15y43efgEv
  ~FF4x15y4(); // tgen
  FF4x15y4(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y4E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y43pqrEv");}
void  ccc::FF4x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y43abcEv");}
void  ccc::FF4x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y43efgEv");}
ccc::FF4x15y4 ::~FF4x15y4(){ note_dtor("_ZN3ccc8FF4x15y4E", this);} // tgen
ccc::FF4x15y4 ::FF4x15y4(){ note_ctor("_ZN3ccc8FF4x15y4E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y4E, buf);
    ::ccc::FF4x15y4 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y4E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y4E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y4E);
    dp->::ccc::FF4x15y4::~FF4x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y4E(Test__ZN3ccc8FF4x15y4E, "_ZN3ccc8FF4x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y4C1Ev();
extern void _ZN3ccc8FF4x15y4D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y4E[] = {
  NSPAIR(_ZN3ccc8FF4x15y4C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y4E[];
extern void _ZN3ccc8FF4x15y43pqrEv();
extern void _ZN3ccc8FF4x15y43abcEv();
extern void _ZN3ccc8FF4x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y4E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y4E[] = {
  {&(_ZTVN3ccc8FF4x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y4E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y4E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y4E[];
Class_Descriptor cd__ZN3ccc8FF4x15y4E = {  "_ZN3ccc8FF4x15y4E", // class name
  bases__ZN3ccc8FF4x15y4E, 2,
  &(vtc__ZN3ccc8FF4x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y4E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y4E),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
namespace ccc { 
struct  FF4x15y5  : virtual ::ccc::EE4x15 {
  virtual void  pqr(); // _ZN3ccc8FF4x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8FF4x15y53efgEv
  virtual void  abc(); // _ZN3ccc8FF4x15y53abcEv
  ~FF4x15y5(); // tgen
  FF4x15y5(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y5E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2 v3}
}
namespace ccc { 
void  ccc::FF4x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y53pqrEv");}
void  ccc::FF4x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y53efgEv");}
void  ccc::FF4x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y53abcEv");}
ccc::FF4x15y5 ::~FF4x15y5(){ note_dtor("_ZN3ccc8FF4x15y5E", this);} // tgen
ccc::FF4x15y5 ::FF4x15y5(){ note_ctor("_ZN3ccc8FF4x15y5E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y5E, buf);
    ::ccc::FF4x15y5 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y5E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y5E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y5E);
    dp->::ccc::FF4x15y5::~FF4x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y5E(Test__ZN3ccc8FF4x15y5E, "_ZN3ccc8FF4x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y5C1Ev();
extern void _ZN3ccc8FF4x15y5D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y5E[] = {
  NSPAIR(_ZN3ccc8FF4x15y5C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y5E[];
extern void _ZN3ccc8FF4x15y53pqrEv();
extern void _ZN3ccc8FF4x15y53abcEv();
extern void _ZN3ccc8FF4x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y5E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y5E[] = {
  {&(_ZTVN3ccc8FF4x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y5E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y5E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y5E[];
Class_Descriptor cd__ZN3ccc8FF4x15y5E = {  "_ZN3ccc8FF4x15y5E", // class name
  bases__ZN3ccc8FF4x15y5E, 2,
  &(vtc__ZN3ccc8FF4x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y5E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y5E),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
namespace ccc { 
struct  FF4x15y6  : virtual ::ccc::EE4x15 {
  virtual void  abc(); // _ZN3ccc8FF4x15y63abcEv
  virtual void  efg(); // _ZN3ccc8FF4x15y63efgEv
  ~FF4x15y6(); // tgen
  FF4x15y6(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y6E) C1{ VBC2{ VBC3{ v3 v1 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y63abcEv");}
void  ccc::FF4x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y63efgEv");}
ccc::FF4x15y6 ::~FF4x15y6(){ note_dtor("_ZN3ccc8FF4x15y6E", this);} // tgen
ccc::FF4x15y6 ::FF4x15y6(){ note_ctor("_ZN3ccc8FF4x15y6E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y6E, buf);
    ::ccc::FF4x15y6 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y6E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y6E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y6E);
    dp->::ccc::FF4x15y6::~FF4x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y6E(Test__ZN3ccc8FF4x15y6E, "_ZN3ccc8FF4x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y6C1Ev();
extern void _ZN3ccc8FF4x15y6D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y6E[] = {
  NSPAIR(_ZN3ccc8FF4x15y6C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x15y63abcEv();
extern void _ZN3ccc8FF4x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y6E[] = {
  {&(_ZTVN3ccc8FF4x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y6E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y6E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y6E[];
Class_Descriptor cd__ZN3ccc8FF4x15y6E = {  "_ZN3ccc8FF4x15y6E", // class name
  bases__ZN3ccc8FF4x15y6E, 2,
  &(vtc__ZN3ccc8FF4x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y6E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y6E),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
namespace ccc { 
struct  FF4x15y7  : virtual ::ccc::EE4x15 {
  virtual void  abc(); // _ZN3ccc8FF4x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y73pqrEv
  ~FF4x15y7(); // tgen
  FF4x15y7(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y7E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y73abcEv");}
void  ccc::FF4x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y73pqrEv");}
ccc::FF4x15y7 ::~FF4x15y7(){ note_dtor("_ZN3ccc8FF4x15y7E", this);} // tgen
ccc::FF4x15y7 ::FF4x15y7(){ note_ctor("_ZN3ccc8FF4x15y7E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y7E, buf);
    ::ccc::FF4x15y7 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y7E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y7E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y7E);
    dp->::ccc::FF4x15y7::~FF4x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y7E(Test__ZN3ccc8FF4x15y7E, "_ZN3ccc8FF4x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y7C1Ev();
extern void _ZN3ccc8FF4x15y7D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y7E[] = {
  NSPAIR(_ZN3ccc8FF4x15y7C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y7E[];
extern void _ZN3ccc8FF4x15y73pqrEv();
extern void _ZN3ccc8FF4x15y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y7E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y7E[] = {
  {&(_ZTVN3ccc8FF4x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y7E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y7E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y7E[];
Class_Descriptor cd__ZN3ccc8FF4x15y7E = {  "_ZN3ccc8FF4x15y7E", // class name
  bases__ZN3ccc8FF4x15y7E, 2,
  &(vtc__ZN3ccc8FF4x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y7E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y7E),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
namespace ccc { 
struct  FF4x15y8  : virtual ::ccc::EE4x15 {
  virtual void  efg(); // _ZN3ccc8FF4x15y83efgEv
  virtual void  abc(); // _ZN3ccc8FF4x15y83abcEv
  ~FF4x15y8(); // tgen
  FF4x15y8(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y8E) C1{ VBC2{ VBC3{ v3 v2 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y83efgEv");}
void  ccc::FF4x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8FF4x15y83abcEv");}
ccc::FF4x15y8 ::~FF4x15y8(){ note_dtor("_ZN3ccc8FF4x15y8E", this);} // tgen
ccc::FF4x15y8 ::FF4x15y8(){ note_ctor("_ZN3ccc8FF4x15y8E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y8E, buf);
    ::ccc::FF4x15y8 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y8E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y8E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y8E);
    dp->::ccc::FF4x15y8::~FF4x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y8E(Test__ZN3ccc8FF4x15y8E, "_ZN3ccc8FF4x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y8C1Ev();
extern void _ZN3ccc8FF4x15y8D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y8E[] = {
  NSPAIR(_ZN3ccc8FF4x15y8C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8FF4x15y83abcEv();
extern void _ZN3ccc8FF4x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y8E[] = {
  {&(_ZTVN3ccc8FF4x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y8E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y8E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y8E[];
Class_Descriptor cd__ZN3ccc8FF4x15y8E = {  "_ZN3ccc8FF4x15y8E", // class name
  bases__ZN3ccc8FF4x15y8E, 2,
  &(vtc__ZN3ccc8FF4x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y8E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y8E),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
namespace ccc { 
struct  FF4x15y9  : virtual ::ccc::EE4x15 {
  virtual void  efg(); // _ZN3ccc8FF4x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8FF4x15y93pqrEv
  ~FF4x15y9(); // tgen
  FF4x15y9(); // tgen
};
//SIG(1 _ZN3ccc8FF4x15y9E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8FF4x15y93efgEv");}
void  ccc::FF4x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8FF4x15y93pqrEv");}
ccc::FF4x15y9 ::~FF4x15y9(){ note_dtor("_ZN3ccc8FF4x15y9E", this);} // tgen
ccc::FF4x15y9 ::FF4x15y9(){ note_ctor("_ZN3ccc8FF4x15y9E", this);} // tgen
}
static void Test__ZN3ccc8FF4x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8FF4x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8FF4x15y9E, buf);
    ::ccc::FF4x15y9 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8FF4x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8FF4x15y9E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y9E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc8FF4x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8FF4x15y9E);
    dp->::ccc::FF4x15y9::~FF4x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8FF4x15y9E(Test__ZN3ccc8FF4x15y9E, "_ZN3ccc8FF4x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8FF4x15y9C1Ev();
extern void _ZN3ccc8FF4x15y9D1Ev();
Name_Map name_map__ZN3ccc8FF4x15y9E[] = {
  NSPAIR(_ZN3ccc8FF4x15y9C1Ev),
  NSPAIR(_ZN3ccc8FF4x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc8FF4x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y9E[];
extern void _ZN3ccc8FF4x15y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8FF4x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8FF4x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8FF4x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8FF4x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8FF4x15y9E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc8FF4x15y9E[] = {
  {&(_ZTVN3ccc8FF4x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8FF4x15y9E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y9E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_8FF4x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8FF4x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8FF4x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8FF4x15y9E[];
Class_Descriptor cd__ZN3ccc8FF4x15y9E = {  "_ZN3ccc8FF4x15y9E", // class name
  bases__ZN3ccc8FF4x15y9E, 2,
  &(vtc__ZN3ccc8FF4x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8FF4x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8FF4x15y9E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8FF4x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8FF4x15y9E),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
namespace ccc { 
struct  FF4x15y10  : virtual ::ccc::EE4x15 {
  virtual void  pqr(); // _ZN3ccc9FF4x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9FF4x15y103abcEv
  ~FF4x15y10(); // tgen
  FF4x15y10(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y10E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x15y103pqrEv");}
void  ccc::FF4x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x15y103abcEv");}
ccc::FF4x15y10 ::~FF4x15y10(){ note_dtor("_ZN3ccc9FF4x15y10E", this);} // tgen
ccc::FF4x15y10 ::FF4x15y10(){ note_ctor("_ZN3ccc9FF4x15y10E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y10E, buf);
    ::ccc::FF4x15y10 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y10E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y10E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y10E);
    dp->::ccc::FF4x15y10::~FF4x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y10E(Test__ZN3ccc9FF4x15y10E, "_ZN3ccc9FF4x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y10C1Ev();
extern void _ZN3ccc9FF4x15y10D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y10E[] = {
  NSPAIR(_ZN3ccc9FF4x15y10C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y10E[];
extern void _ZN3ccc9FF4x15y103pqrEv();
extern void _ZN3ccc9FF4x15y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y10E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y10E[] = {
  {&(_ZTVN3ccc9FF4x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y10E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y10E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y10E[];
Class_Descriptor cd__ZN3ccc9FF4x15y10E = {  "_ZN3ccc9FF4x15y10E", // class name
  bases__ZN3ccc9FF4x15y10E, 2,
  &(vtc__ZN3ccc9FF4x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y10E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y10E),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
namespace ccc { 
struct  FF4x15y11  : virtual ::ccc::EE4x15 {
  virtual void  pqr(); // _ZN3ccc9FF4x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9FF4x15y113efgEv
  ~FF4x15y11(); // tgen
  FF4x15y11(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y11E) C1{ VBC2{ VBC3{ v1 v3 v2}} v1 v2}
}
namespace ccc { 
void  ccc::FF4x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x15y113pqrEv");}
void  ccc::FF4x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x15y113efgEv");}
ccc::FF4x15y11 ::~FF4x15y11(){ note_dtor("_ZN3ccc9FF4x15y11E", this);} // tgen
ccc::FF4x15y11 ::FF4x15y11(){ note_ctor("_ZN3ccc9FF4x15y11E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y11E, buf);
    ::ccc::FF4x15y11 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y11E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y11E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y11E);
    dp->::ccc::FF4x15y11::~FF4x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y11E(Test__ZN3ccc9FF4x15y11E, "_ZN3ccc9FF4x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y11C1Ev();
extern void _ZN3ccc9FF4x15y11D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y11E[] = {
  NSPAIR(_ZN3ccc9FF4x15y11C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y11E[];
extern void _ZN3ccc9FF4x15y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y11E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y11E[] = {
  {&(_ZTVN3ccc9FF4x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y11E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y11E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y11E[];
Class_Descriptor cd__ZN3ccc9FF4x15y11E = {  "_ZN3ccc9FF4x15y11E", // class name
  bases__ZN3ccc9FF4x15y11E, 2,
  &(vtc__ZN3ccc9FF4x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y11E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y11E),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
namespace ccc { 
struct  FF4x15y12  : virtual ::ccc::EE4x15 {
  virtual void  abc(); // _ZN3ccc9FF4x15y123abcEv
  ~FF4x15y12(); // tgen
  FF4x15y12(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y12E) C1{ VBC2{ VBC3{ v2 v1 v3}} v1}
}
namespace ccc { 
void  ccc::FF4x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9FF4x15y123abcEv");}
ccc::FF4x15y12 ::~FF4x15y12(){ note_dtor("_ZN3ccc9FF4x15y12E", this);} // tgen
ccc::FF4x15y12 ::FF4x15y12(){ note_ctor("_ZN3ccc9FF4x15y12E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y12E, buf);
    ::ccc::FF4x15y12 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y12E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y12E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y12E);
    dp->::ccc::FF4x15y12::~FF4x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y12E(Test__ZN3ccc9FF4x15y12E, "_ZN3ccc9FF4x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y12C1Ev();
extern void _ZN3ccc9FF4x15y12D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y12E[] = {
  NSPAIR(_ZN3ccc9FF4x15y12C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9FF4x15y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y12E[] = {
  {&(_ZTVN3ccc9FF4x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y12E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y12E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y12E[];
Class_Descriptor cd__ZN3ccc9FF4x15y12E = {  "_ZN3ccc9FF4x15y12E", // class name
  bases__ZN3ccc9FF4x15y12E, 2,
  &(vtc__ZN3ccc9FF4x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y12E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y12E),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
namespace ccc { 
struct  FF4x15y13  : virtual ::ccc::EE4x15 {
  virtual void  efg(); // _ZN3ccc9FF4x15y133efgEv
  ~FF4x15y13(); // tgen
  FF4x15y13(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y13E) C1{ VBC2{ VBC3{ v2 v3 v1}} v1}
}
namespace ccc { 
void  ccc::FF4x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9FF4x15y133efgEv");}
ccc::FF4x15y13 ::~FF4x15y13(){ note_dtor("_ZN3ccc9FF4x15y13E", this);} // tgen
ccc::FF4x15y13 ::FF4x15y13(){ note_ctor("_ZN3ccc9FF4x15y13E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y13E, buf);
    ::ccc::FF4x15y13 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y13E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y13E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y13E);
    dp->::ccc::FF4x15y13::~FF4x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y13E(Test__ZN3ccc9FF4x15y13E, "_ZN3ccc9FF4x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y13C1Ev();
extern void _ZN3ccc9FF4x15y13D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y13E[] = {
  NSPAIR(_ZN3ccc9FF4x15y13C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9FF4x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y13E[] = {
  {&(_ZTVN3ccc9FF4x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y13E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y13E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y13E[];
Class_Descriptor cd__ZN3ccc9FF4x15y13E = {  "_ZN3ccc9FF4x15y13E", // class name
  bases__ZN3ccc9FF4x15y13E, 2,
  &(vtc__ZN3ccc9FF4x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y13E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y13E),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
namespace ccc { 
struct  FF4x15y14  : virtual ::ccc::EE4x15 {
  virtual void  pqr(); // _ZN3ccc9FF4x15y143pqrEv
  ~FF4x15y14(); // tgen
  FF4x15y14(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y14E) C1{ VBC2{ VBC3{ v1 v2 v3}} v1}
}
namespace ccc { 
void  ccc::FF4x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9FF4x15y143pqrEv");}
ccc::FF4x15y14 ::~FF4x15y14(){ note_dtor("_ZN3ccc9FF4x15y14E", this);} // tgen
ccc::FF4x15y14 ::FF4x15y14(){ note_ctor("_ZN3ccc9FF4x15y14E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y14E, buf);
    ::ccc::FF4x15y14 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y14E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y14E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y14E);
    dp->::ccc::FF4x15y14::~FF4x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y14E(Test__ZN3ccc9FF4x15y14E, "_ZN3ccc9FF4x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y14C1Ev();
extern void _ZN3ccc9FF4x15y14D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y14E[] = {
  NSPAIR(_ZN3ccc9FF4x15y14C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y14E[];
extern void _ZN3ccc9FF4x15y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9FF4x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y14E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y14E[] = {
  {&(_ZTVN3ccc9FF4x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y14E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y14E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y14E[];
Class_Descriptor cd__ZN3ccc9FF4x15y14E = {  "_ZN3ccc9FF4x15y14E", // class name
  bases__ZN3ccc9FF4x15y14E, 2,
  &(vtc__ZN3ccc9FF4x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y14E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y14E),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
namespace ccc { 
struct  FF4x15y15  : virtual ::ccc::EE4x15 {
  ~FF4x15y15(); // tgen
  FF4x15y15(); // tgen
};
//SIG(1 _ZN3ccc9FF4x15y15E) C1{ VBC2{ VBC3{ v1 v2 v3}}}
}
namespace ccc { 
ccc::FF4x15y15 ::~FF4x15y15(){ note_dtor("_ZN3ccc9FF4x15y15E", this);} // tgen
ccc::FF4x15y15 ::FF4x15y15(){ note_ctor("_ZN3ccc9FF4x15y15E", this);} // tgen
}
static void Test__ZN3ccc9FF4x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9FF4x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9FF4x15y15E, buf);
    ::ccc::FF4x15y15 *dp, &lv = *(dp=new (buf) ::ccc::FF4x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9FF4x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9FF4x15y15E)");
    check_base_class_offset(lv, (::ccc::AA4*)(::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y15E");
    check_base_class_offset(lv, (::ccc::EE4x15*), 0, "_ZN3ccc9FF4x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9FF4x15y15E);
    dp->::ccc::FF4x15y15::~FF4x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9FF4x15y15E(Test__ZN3ccc9FF4x15y15E, "_ZN3ccc9FF4x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9FF4x15y15C1Ev();
extern void _ZN3ccc9FF4x15y15D1Ev();
Name_Map name_map__ZN3ccc9FF4x15y15E[] = {
  NSPAIR(_ZN3ccc9FF4x15y15C1Ev),
  NSPAIR(_ZN3ccc9FF4x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc6EE4x15E;
extern VTBL_ENTRY _ZTIN3ccc6EE4x15E[];
extern  VTBL_ENTRY _ZTVN3ccc6EE4x15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc6EE4x15E[];
static Base_Class bases__ZN3ccc9FF4x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 1},
  {&cd__ZN3ccc6EE4x15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9FF4x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9FF4x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9FF4x15y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY _tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc6EE4x15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
static  VTT_ENTRY vtt__ZN3ccc9FF4x15y15E[] = {
  {&(_ZTVN3ccc9FF4x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9FF4x15y15E[7]),  7,10},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y15E[6]),  6,9},
  {&(_tg__ZTVN3ccc6EE4x15E__NS_9FF4x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9FF4x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9FF4x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9FF4x15y15E[];
Class_Descriptor cd__ZN3ccc9FF4x15y15E = {  "_ZN3ccc9FF4x15y15E", // class name
  bases__ZN3ccc9FF4x15y15E, 2,
  &(vtc__ZN3ccc9FF4x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9FF4x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9FF4x15y15E),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9FF4x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9FF4x15y15E),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

